hibernate 内存使用分析
query.list()
query.iteator();
query.scroll();
三者使用的时候谁占用的内存多,谁占用的少?
我认为
应该是
query.list()>query.iteartor()>query.scroll();
但是测试后发现是(不是严格的测试环境)
query.scroll()>query.list()>query.iteartor()
一个简单的scroll.last()也会消耗很多内存。
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>
失望中.....