首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

关于hibernate性能的统制

2012-09-02 
关于hibernate性能的控制看了一些文章,结合自己的i些看法,得到以下几点意见:1.除了1对1的关联之外,其他的

关于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插入数据时仅插入非空数据,当修改数据时只修改变化的数据,实现如下:
<class name="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("delete from DeleteTest dt where dt.tid > 1").executeUpdate(); 

9.修改hibernate.properties或hiberante.cfg.xml,增加了以下两句: 
  hibernate.jdbc.fetch_size=50   对查询效率明显增加
  hibernate.jdbc.batch_size=100  对批量操作效率增加
  减少操作数据库的次数
或 hiberante.cfg.xml(Oracle ,sql server 支持,mysql不支持)
<property name="hibernate.jdbc.fetch_size">50</property>
<property name="hibernate.jdbc.batch_size">30</property>

10.多使用filter过滤结果集,如下:
session.createFilter(parent.getChildren(),"").setFirstResult(0),setMaxResult(10).list();
session.createFilter(parent.getChildren(),"where this.age>25").list();

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

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,多对多集合使用Set6、继承类使用显式多态7、表字段要少,表关联不要怕多,有二级缓存撑腰



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

热点排行