hibernate优化

来源:互联网 发布:adobe xd mac 下载 编辑:程序博客网 时间:2024/06/04 19:51
1、使用双向一对多关联,不使用单向一对多
2、在one-to-many 关系中,将many一方设为主动方(inverse=false)将有助性能的改善。
3、ibernate可以通过设置hibernate.jdbc.fetch_size,hibernate.jdbc.batch_size等属性,对Hibernate进行优化。
    fetch_size:
    对于Oracle的JDBC驱动来说,是不会1次性把1万条取出来的,而只会取出Fetch Size条数,当纪录集遍历完了这些记录以后,
    再去数据库取Fetch Size条数据。因此大大节省了无谓的内存消耗。
    当然Fetch Size设的越大,读数据库的次数越少,速度越快;Fetch Size越小,读数据库的次数越多,速度越慢。
    batch_size:
    Batch Size是设定对数据库进行批量删除,批量更新和批量插入的时候的批次大小,有点相当于设置Buffer缓冲区大小的意思。
    Batch Size越大,批量操作的向数据库发送sql的次数越少,速度就越快。
    测试结果是当Batch Size=0的时候,使用Hibernate对Oracle数据库删除1万条记录需要25秒,Batch Size = 50的时候,删除仅仅需要5秒!!!
4、在处理大数据量时,会有大量的数据缓冲保存在Session的一级缓存中,这缓存大太时会 严重显示性能,
    所以在使用Hibernate处理大数据量的,可以使用session.clear()或者session.evict(Object)来清除全部或单个的缓存。
5、使用二级缓存
6、查询时:
    get()和load方法得到单个对象
    list()和iterator()方法得到结果集

    load()方法会使用二级缓存,
    get()方法在一级缓存没有找到的情况下会直接查询数据库,不会去二级缓存中查找。
    对使用了二级缓存的对象进行查询时最好使用load()方法,以充分利用二级缓存来提高检索的效率。

    list()方法会一次获得所有的结果集对象,而且它会依据查询的结果初始化所有的结果集对象。
    这在结果集非常大的时候会非常占内存。
    list()方法只能使用二级缓存中的查询缓存,而无法使用二级缓存对单个对象的缓存,
    所以,除非重复执行相同的查询操作,否则无法利用缓存的机制来提高查询的效率。
    iterator()方法在执行时不会一次初始化所有的对象,而是根据对结果集的访问情况来初始化对象。
    iterator()方法则可以充分利用二级缓存,根据ID检索对象的时候会首先到缓存中查找,
    只有在找不到的情况下才会执行相应的查询语句,

    所以,缓存中对象的存在与否会影响到SQL语句的执行数量。


参考:http://cache.baiducontent.com/c?m=9f65cb4a8c8507ed4fece763104080224e0add216b97c71508d39019d5394c413037bee43a715042cec57e650aad4d41e9f03d75360837b7ec92ce15c9fecf6879877d6f204bc61d41954eb8cb3732b721872beeb86997ad8346&p=c064c54ad6c04bf203a7cd2d02148c&newp=803be715d9c342a54ebe9b7c4f0d89231610db2151ddd01569&user=baidu&fm=sc&query=hibernate+%D3%C5%BB%AF&qid=&p1=1

原创粉丝点击