当前位置:编程学习 > JAVA >>

hibernate优化

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语句的执行数量。

 

补充:软件开发 , Java ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,