hibernate 内存使用分析

query.list()
query.iteator();
query.scroll();

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

我认为
应该是
query.list()>query.iteartor()>query.scroll();

但是测试后发现是(不是严格的测试环境)
query.scroll()>query.list()>query.iteartor()

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

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

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

首先:内存消耗大小不代表性能问题 这句话很对,但要看在什么场合,
其次,我的问题是内存消耗大,说明用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

>说明用query.scroll()遍历的时候它的内存没有释放
这个结果需要得到确认,使用Jprofiler检测服务器内存,运行一段时间强行GC,看看加大的内存是否变小,否则存在内存泄漏,不是Hibernate错,是你用的方法错,更不建议你去“考虑改造hibernate ”.

那怎么可以解决Session.createQuery(HQL).list 返回的是对象而不是对象数据的问题。

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

还请指教

泛型
Iterator<class> / List<class>

失望中.....