`
j_butterfly
  • 浏览: 111926 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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上搜了一下,出了很多介绍这方面的文章,写的最好的,我觉得是这篇文章,有测试用例来说明一切:
  我大概总结一下:在查询一对多关系数据,后面会用到“多”的数据。数据量比较大的时候(从数据库取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了。所以要对不同的情况,进行不同的优化,才能让性能最佳!

22
7
分享到:
评论
6 楼 clarkcc1988 2010-04-06  
j_butterfly 写道
clarkcc1988 写道
你好 我提个问题可以吗
首先第一个问题是:你的一对多关联关系中是否使用了延迟加载 lazy=true or false
其次 如果说在分页查询的时候不使用left join fetch 的话 是 性能的问题解决了。 但是在前台会出现 延迟加载的错误 failed to lazily initialize a collection of role

我的情况是
1.使用了延迟加载
2.一对多关联关系
3.功能是 搜出1方的集合 并且还要显示 每个一方所对应的多方集合
4.我没有使用opensessioninview

我的QQ号是171757607  我不是经常来上JAVAEYE
所以请你加我的QQ 这块我在开发中遇见了一些问题 希望与你沟通 

 
那为什么不用OpenSessionInView呢?
如果不用那就在查询的代码里设置lazy 为 false了




OpenSessionInView是一把双刃剑 使用在外网上面 有可能会造成页面死锁
你加我的QQ了吗?
5 楼 j_butterfly 2010-03-05  
clarkcc1988 写道
你好 我提个问题可以吗
首先第一个问题是:你的一对多关联关系中是否使用了延迟加载 lazy=true or false
其次 如果说在分页查询的时候不使用left join fetch 的话 是 性能的问题解决了。 但是在前台会出现 延迟加载的错误 failed to lazily initialize a collection of role

我的情况是
1.使用了延迟加载
2.一对多关联关系
3.功能是 搜出1方的集合 并且还要显示 每个一方所对应的多方集合
4.我没有使用opensessioninview

我的QQ号是171757607  我不是经常来上JAVAEYE
所以请你加我的QQ 这块我在开发中遇见了一些问题 希望与你沟通 

 
那为什么不用OpenSessionInView呢?
如果不用那就在查询的代码里设置lazy 为 false了
4 楼 clarkcc1988 2010-02-25  
你好 我提个问题可以吗
首先第一个问题是:你的一对多关联关系中是否使用了延迟加载 lazy=true or false
其次 如果说在分页查询的时候不使用left join fetch 的话 是 性能的问题解决了。 但是在前台会出现 延迟加载的错误 failed to lazily initialize a collection of role

我的情况是
1.使用了延迟加载
2.一对多关联关系
3.功能是 搜出1方的集合 并且还要显示 每个一方所对应的多方集合
4.我没有使用opensessioninview

我的QQ号是171757607  我不是经常来上JAVAEYE
所以请你加我的QQ 这块我在开发中遇见了一些问题 希望与你沟通 
3 楼 j_butterfly 2008-12-17  
yuanye218 写道

提个问题:第一次Join fetch: 1,219 millis 第二次(分页)Join fetch: 1,660 millis 个人感觉这两次查询没有区别,都是把数据一次读入到内存。paging只是多了在内存中的分页,为什么时间会差距这么大呢?

我猜,可能是多了一次对所有数据进行循环,取分页大小数据。可能取前20条时,时间差的不是很多,但如果取最后20条时,时间会长一些。这个还是要问hibernate对这两种情况的实现方式了吧
2 楼 yuanye218 2008-12-16  
提个问题:
第一次Join fetch: 1,219 millis
第二次(分页)Join fetch: 1,660 millis
个人感觉这两次查询没有区别,都是把数据一次读入到内存。
paging只是多了在内存中的分页,为什么时间会差距这么大呢?
1 楼 yourgame 2008-12-15  
看着hibernate的语句就怕怕,当然优化后少了很多很多,但是感觉还是很多很多。感觉 iBatis比较适合自己。

相关推荐

Global site tag (gtag.js) - Google Analytics