Hibernate性能调优心得
http://www.ucai8.com/viewNote.do?noteId=402881851e2c5780011e350260e801ca
?
前几天查看后台的日志时,发现常出现Hibernate的警告信息:
WARN (org.hibernate.hql.ast.QueryTranslatorImpl:328) - firstResult/maxResults specified with collection fetch; applying in memory!??在中文Google上搜了搜,没有找到什么有用的信息,之后在英文的Google上搜了一下,出了很多介绍这方面的文章,写的最好的,我觉得是这篇文章,有测试用例来说明一切:http://java.dzone.com/articles/hibernate-tuning-queries-using?page=0,0
??我大概总结一下:在查询一对多关系数据,后面会用到“多”的数据。数据量比较大的时候(从数据库取500条记录以上),用fetch join比较好,Hibernate官方的文档也说了,它会只执行1条SQL语句。但是如果用分页查询时,比如一次才取50条数据时,不用fetch join要快,因为如果用了fetch join后,hibernate并不能在数据库进行分页,会把所有数据库到内存中,然后分页,当然性能 会差的很远(所以会报一个前面我写的警告信息)。这时用延时加载比如快,这时还可以更加优化,通过指定batch-size的大小,来批量从数据中读。??通过自己的测试,光是Hibernate发出的SQL语句就少了很多。之前我用Fetch join用分布时有200多条Sql语句产生,不用fetch join时只有23条了,再加了batch-size优化后只有16条sql了。所以要对不同的情况,进行不同的优化,才能让性能最佳!
那为什么不用OpenSessionInView呢?
如果不用那就在查询的代码里设置lazy 为 false了
那为什么不用OpenSessionInView呢?
如果不用那就在查询的代码里设置lazy 为 false了
OpenSessionInView是一把双刃剑 使用在外网上面 有可能会造成页面死锁
你加我的QQ了吗?