【问题标题】:Does the method "session.createSQLQuery()" have a memory leak? How to resolve it?方法“session.createSQLQuery()”是否存在内存泄漏?如何解决?
【发布时间】:2019-07-22 07:55:32
【问题描述】:

我的应用程序存在内存泄漏问题,所以我使用 JProfiler 查找原因。在使用session.createSQLQuery()时,我发现问题是由Hibernate中的本机sql引起的。

其他人有同样的问题吗?如何解决问题?我必须在 Hibernate 中使用原生 SQL,因为 HQL 不符合我的要求。

泄露的类是HashMap,根本原因是org.hibernate.hql.internal.ast.tree.selectexpressionimpl。我发现它在createSQLQuery() 方法中使用。

由于我的表名多种多样(200+表),无法为每个表创建一个POJO,所以我需要在Hibernate中使用原生SQL。我应该怎么办?有什么想法吗?

我在这里放了一些代码:

session = HibernateUtil.getSession();
            session.beginTransaction();

            for (int i = 0; i < list.size(); i++) {
                String sql = (String) list.get(i);

                SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");

                Query query = session.createSQLQuery(sql);
                query.setParameter(0, new Date());
                query.setParameter(1, new Date());
                //query.setParameter(2, format.format(new Date()));
                query.executeUpdate();
            }

            session.getTransaction().commit();
            b = true;

我在 JProfiler 中的检查显示内存泄漏:

我发现内存泄漏发生在插入/更新 SQL 查询中,而不是在选择查询中。

【问题讨论】:

  • 请贴一些代码

标签: java hibernate


【解决方案1】:

问题是由于在 QueryPlanCache 中添加了不可用的键。 此问题已在较新的休眠版本中得到修复。

此 jira 票证中提供了更多详细信息:https://issues.jboss.org/browse/JBPAPP-4579

【讨论】:

  • 感谢您的回答。但是我的hibernate版本是5.2.17,这个版本好像已经修复了,为什么还在呢?
  • 使用最新版本的Hibernate可以避免这个问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-28
  • 1970-01-01
  • 1970-01-01
  • 2013-04-01
  • 2011-08-14
  • 2021-11-18
相关资源
最近更新 更多