我正在玩Play! 2.3使用Akka多线程的应用程序。每个线程访问MySQL数据库并运行一些计算。每次我运行一组这些任务时,应用程序的内存占用量都会增加,这主要是由于永远不会消失的JDBC4PreparedStatement
个对象。几次运行后,这些对象占用超过200MB,很快就会出现内存不足错误。调用Sytem.gc()
根本不会降低它。
我使用Hibernate 4.3.0进行持久化,而clear()
上的EntityManager
调用也没有帮助,所以不存在持久对象存放在任何地方。 This answer表示可能会在某处保留Statement
个对象,但我永远不会直接与Statement
个对象或Connection
个对象进行交互,只需使用JPA&#39 ; s EntityManager
。
这是MySQL JDBC或JPA的预期行为吗?我怎样才能解决这个内存泄漏?我不确定在哪里寻找解决方案,不确定这是否是由MySQL或JDBC或JPA或Hibernate的实现引起的。或者可能是Play的方式!处理JPA。
修改
要清楚,我没有使用Connection
或Statement
个对象,因此我无法关闭任何内容。这是一个示例,我在事务中从Play获取EntityManager
,执行某些操作,然后提交事务。
JPA.withTransaction( () -> {
Site site= JPA.em().find(Site.class, siteId);
site.setDomain("www.stackoverflow.com");
});
答案 0 :(得分:0)
这是预期的行为。您必须通过设置:
告诉mysql连接返回光标而不是选择完整集stmt = conn.createStatement(java.sql.ResultSet.TYPE_FORWARD_ONLY,
java.sql.ResultSet.CONCUR_READ_ONLY);
stmt.setFetchSize(Integer.MIN_VALUE);
根据您的要求,您的具体设置可能略有不同,因此可能需要进行一些调整。