关于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()); }
1、使用双向一对多关联,不使用单向一对多2、灵活使用单向多对一关联3、不用一对一,用多对一取代4、配置对象缓存,不使用集合缓存5、一对多集合使用Bag,多对多集合使用Set6、继承类使用显式多态7、表字段要少,表关联不要怕多,有二级缓存撑腰