关于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、表字段要少,表关联不要怕多,有二级缓存撑腰
暂时这么多,下次想到再写吧!