Hibernate: org.hibernate.query.list内存消耗过大的问题?

问题描述

使用JProfiler进行性能测试时发现如下情况: 在程式不停的运行中,query.list分配的内存不会被回收。不断创建新的instance. 是多线程运行的程序。 使用Query的方法如下:   public List find(String strhql) {          // TODO Auto-generated method stub            List result = null;          Session session = null;          Query query = null;        try {              session = this.getSession();              session.beginTransaction();              query = session.createQuery(strhql);            result = query.list();              session.getTransaction().commit();            session.flush();            session.clear();            session.close();        } catch (Exception e) {           session.getTransaction().rollback();            logger.debug("执行数据库中查询时失败,语句为:" + strhql, e);            } finally {              query = null;            this.closeSession(session);          }           return result;       }   有没有遇到过这种情况的朋友,有可行的解决方法么?    问题补充:<div class="quote_title">javahero1984 写道</div><div class="quote_div">query.list(); 分配了新的内存地址 result是对这个内存的引用,能否回收是要看你的result的引用以及外层对result的引用什么时候消除,仔细检查一下,如果最外层的引用消除就能回收内存了。这不是hibernate的错。</div><br /><br /><br />在该释放result应用的地方,我都已经释放掉,但是对于org.hibernate.Query.list的内存依然没有被释放掉

解决方案

木有2级缓存我觉得可能就变2个了检查下你HibernateSessionFactory的构造方法,如果每次都是config之后new一个,那你就用完直接把sessionFactory也关了然后看下你Impl包里面的THDservice,是不是有什么方法没有if做判断一直叫getParam()
解决方案二:

朋友,你这个问题解决了吗,我都快愁死了!
解决方案三:

引用没有用Spring大哥你也变通下嘛,hibernate配置扔出来看下啊hibernate的 list()不释放,我个人觉得是它返回了proxy 相当于iterator方法给你的延时加载,然后等你调用它但实际上你已经把需要的结果实例化给了result (result你null不null都不重要,你flush不flush也不用要,clear不clear也不重要,只要你close了就行)关闭session后 这个proxy并不会释放,因为放在2级缓存里了好了,再次session,因为list()方法查询一级缓存后就直接找数据库了压根不会找2级,你每次List result = query.list() 就会创一个proxy但这个proxy完全不会被用到,也没有释放另外要说的是,Hibernate 的list()default设置是不会返回proxy的所以要看你配置文件 ! 明白?
解决方案四:

session = this.getSession(); 你用这种方法打开session,显然是让spring帮你管理了你自己close不close都不会理你,而且你每次null一个Session肯定新建一个instance啊。。。贴你的配置文件
解决方案五:

在你取出list.get(0)后手动设置result=null
解决方案六:

List results = CollectionHelper.EMPTY_LIST;public static final List EMPTY_LIST = Collections.unmodifiableList( new ArrayList(0) );这是Hibernate里的源码,调用Query.list都会产生一个新的ArrayList,这是你没法控制的,除非你想要修改它,不过我觉得没有这样的必要,因为我想这在于你的程序的设计,多线程,你还希望Query.list返回单例,不太明白你的意图是?而且你所说的内存消耗过大的问题,我不觉得这真实存在,很多项目里面我都使用这个,但没有什么问题发生。
解决方案七:

query.list(); 分配了新的内存地址 result是对这个内存的引用,能否回收是要看你的result的引用以及外层对result的引用什么时候消除,仔细检查一下,如果最外层的引用消除就能回收内存了。这不是hibernate的错。

时间: 2025-01-21 19:43:44

Hibernate: org.hibernate.query.list内存消耗过大的问题?的相关文章

Android加载不同DPI资源与内存消耗之间的关系

Android DPI 分级标准简介 Android 设备在物理尺寸和屏幕密度上都有很大的不同,为了简化多设备的设计方案,就是设定一套分级标准.屏幕密度上的分级标准就是:LDPI.MDPI.HDPI.XHDPI,也就是各种大小的 DPI(Dots per inch).DPI 就是屏幕像素密度的衡量标准. 不同设备共享同一套 DPI 资源有哪些问题? 现在进入正题. Q:不少公司出于简化设计和研发的目的,往往在方案中只使用一套 DPI 资源,这样做可不可行呢? A:Android 有一套加载资源的

hibernate配置文件hibernate.cfg.xml的详细解释

标准的XML文件的起始行,version='1.0'表明XML的版本,encoding='gb2312'表明XML文件的编码方式 <?xml version='1.0' encoding='Utf-8'?> 表明解析本XML文件的DTD文档位置,DTD是Document Type Definition 的缩写,即文档类型的定义,XML解析器使用DTD文档来检查XML文件的合法性.hibernate.sourceforge.net/hibernate-configuration-3.0dtd可以

【框架】[Hibernate]利用Hibernate进行单表的增删改查-Web实例

转载请注明出处:http://blog.csdn.net/qq_26525215 本文源自[大学之旅_谙忆的博客] 前面两篇博客已经将Hibernate的基础知识讲解得差不多了,差不多到写实例的时候了. 本篇只用hibernate进行单表的增删改查. 应用Hibernate,对students表进行增删改查. service层和DAO层,我都是直接写实现类了(因为这里主要是演示一下Hibernate的使用),如果是开发项目,注意一定要写接口! 准备数据库: 首先准备一个students表: cr

(译)内存沉思:多个名称相关的神秘的SQL Server内存消耗者。

原文:(译)内存沉思:多个名称相关的神秘的SQL Server内存消耗者.   原文出处:https://blogs.msdn.microsoft.com/sqlmeditation/2013/01/01/memory-meditation-the-mysterious-sql-server-memory-consumer-with-many-names/   对于多个不同名称的内存消费者 你曾经是否想知道内存授予是什么(Memory grants )?什么是查询执行的保留(预定)内存(QE R

Java Persistence with Hibernate中文版Hibernate实战第2版出版

Java Persistence with Hibernate中文版Hibernate实战第2版出版 图灵出版社官方Hibernate实战(第2版)链接为: http://www.turingbook.com/Books/ShowBook.aspx?BookID=260 书 名: Hibernate实战(第2版) 评论星级: **** 书 号: 978-7-115-17448-2 原 书 名: Java Persistence with Hibernate 原出版社: Manning Publi

AIX/LINUX系统中如何查看单个进程在os层面的内存消耗

--如何查看单个进程在os层面的内存消耗 AIX: $ svmon -Pt10 | perl -e 'while(<>){print if($.==2||$&&&!$s++);$.=0 if(/^-+$/)}' ---- -用这个可以看最大的占用内存的10个进程 ------------------------------------------------------------------------------- Pid Command Inuse Pin Pgs

listview-用重复布局 和用ListView的内存消耗

问题描述 用重复布局 和用ListView的内存消耗 只有3-5个项的一个列表. 使用重复4个布局 还是用一个不能滚动的Listview 哪个会流畅 解决方案 怎么选?两边都有人选 解决方案二: 才3-5项,性能先可以忽略如果布局一样,那就用listview加载一样布局,看需要. 解决方案三: listview加载,adapter 是异步. 解决方案四: listview加载,adapter 是异步. 解决方案五: 使用重复4个布局更流畅 解决方案六: 使用重复4个布局更流畅 解决方案七: Li

Java Persistence with Hibernate中文版Hibernate实战第2版勘误

http://www.javaeye.com/topic/179802 Hibernate Spring Java Persistence API EJB3 相关的术语及关键字 还有其它相关的一些链接: Java Persistence with Hibernate中文版Hibernate实战第2版出版 关于Java持久化相关的资源汇集:Java Persistence API 错误难免,有则改之,无则加勉! ===========================================

org.hibernate.HibernateException: /hibernate.cfg.xml not found

问题描述 执行HibernateTest.java报错:Exceptioninthread"main"org.hibernate.HibernateException:/hibernate.cfg.xmlnotfoundatorg.hibernate.internal.util.ConfigHelper.getResourceAsStream(ConfigHelper.java:173)atorg.hibernate.cfg.Configuration.getConfiguration