关于hibernate性能的控制

看了一些文章,结合自己的i些看法,得到以下几点意见:

1.除了1对1的关联之外,其他的关联设置建议根据实际情况设置延时加载.

2.session放在ThreadLoacal中去做控制,这样既节省了session来回打开,关闭的开销,又方便的跨session的事务操作,类似于事务传播

3.尽量避免使用联合主键,而去使用代理主键.

4.使用,同一个数据对象,使用2套对象模型.一个是具有全部属性的,还有1个是只存在主外键属性的.其实也可以多写hql,只是查询的时候只是查询我们需要的字段,而后封装成我们需要的对象.

5.合理使用hibernate的缓存机制.1级缓存是默认开启的,及时清除不需要的一级缓存数据:由于Hibernate默认采用一级缓存,而在session的生命期间,所有数据抓取之后会放入一级缓存中,而当数据规模比较庞大时,抓取到内存中的数据会让内存压力非常大,一般分批操作数据,被一次操作之后将一级缓存清除,譬如

session.clear(User.class)

6.dynamic-insert,dynamic-update,动态插入和动态更新,指的是让Hibernate插入数据时仅插入非空数据,当修改数据时只修改变化的数据,实现如下:

<classname="User"table="users"dynamic-insert="true/false"dynamic-update="true/false"></class>

此项性能提升有限

7.inverse='true'的使用,一般情况下在one-to-many关系中,将many一方设为主动方(inverse=false)将有助性能的改善

8.如果要追求批量删除的性能,应该使用hibernate的batch功能,如下:session.createQuery("deletefromDeleteTestdtwheredt.tid>1").executeUpdate();

9.修改hibernate.properties或hiberante.cfg.xml,增加了以下两句:

hibernate.jdbc.fetch_size=50对查询效率明显增加

hibernate.jdbc.batch_size=100对批量操作效率增加

减少操作数据库的次数

或hiberante.cfg.xml(Oracle,sqlserver支持,mysql不支持)

<propertyname="hibernate.jdbc.fetch_size">50</property>

<propertyname="hibernate.jdbc.batch_size">30</property>

10.多使用filter过滤结果集,如下:

session.createFilter(parent.getChildren(),"").setFirstResult(0),setMaxResult(10).list();

session.createFilter(parent.getChildren(),"wherethis.age>25").list();

11.HibernateIterator方法在对内存消耗上有一定的减缓作用,常用于大数据量的处理,如下:

while(it.hasNext()){  YouObject object = (YouObject)it.next();  session.evict(youObject);  sessionFactory.evice(YouObject.class, youObject.getId());  }

12.复杂逻辑尽量自编hql去完成查询工作,避免hibernate自操作,对于hibernate的初使用者是相当好的解决方案!

最后添加robbin对hibernate性能调优的一些建议:

1、使用双向一对多关联,不使用单向一对多
2、灵活使用单向多对一关联
3、不用一对一,用多对一取代
4、配置对象缓存,不使用集合缓存
5、一对多集合使用Bag,多对多集合使用Set
6、继承类使用显式多态
7、表字段要少,表关联不要怕多,有二级缓存撑腰

暂时这么多,下次想到再写吧!

相关推荐