hibernate 内存使用分析

07-06-07 dearfashion
query.list()

query.iteator();

query.scroll();

三者使用的时候谁占用的内存多,谁占用的少?

我认为

应该是

query.list()>query.iteartor()>query.scroll();

但是测试后发现是(不是严格的测试环境)

query.scroll()>query.list()>query.iteartor()

一个简单的scroll.last()也会消耗很多内存。

banq
2007-06-12 10:07
你的研究方向有误区,内存消耗大小不代表性能问题,相反,只要我们能够对内存有控制,内存越耗费大,性能就越好,这就是Cache的目的所在。

Java企业设计不像微系统那样,斤斤计较硬件,而应该充分利用廉价硬件,提高软件设计质量。

dearfashion
2007-06-14 19:34
首先:内存消耗大小不代表性能问题 这句话很对,但要看在什么场合,

其次,我的问题是内存消耗大,说明用query.scroll()遍历的时候它的内存没有释放,这与我的理解相抵触,经过思考,我想可能是当ResultSet 为type_scroll_sensitive模式,遍历的时候会保留结果(没有测试,我想应该是这样)

这个问题来源于hibernate中的一个问题

HQL="select id,name,desc from table";

Query query=Session.createQuery(HQL);

List list=query.list()

这样list中存的就是一个数组,而不能是一个对象,比如像

Query query=Session.createSqlQuery(SQL).addEntity(Class);

所以我考虑改造hibernate

用query.scroll()得到结果然后再封装到一个对象中。

我不用query.list就是考虑到内存消耗大,想不到query.scroll消耗内存更大。

那位大虾有更好的封装方式??

thank

banq
2007-06-15 16:36
>说明用query.scroll()遍历的时候它的内存没有释放

这个结果需要得到确认,使用Jprofiler检测服务器内存,运行一段时间强行GC,看看加大的内存是否变小,否则存在内存泄漏,不是Hibernate错,是你用的方法错,更不建议你去“考虑改造hibernate ”.

dearfashion
2007-06-15 16:45
那怎么可以解决Session.createQuery(HQL).list 返回的是对象而不是对象数据的问题。

我不想用Session.createSQLQuery(SQL).list

还请指教

猜你喜欢
2Go 1 2 下一页