gpt4 book ai didi

Java 堆已被 JDBC4PreparedStatement 填满

转载 作者:行者123 更新时间:2023-11-29 21:15:04 27 4
gpt4 key购买 nike

我正在运行 Play! 2.3 使用 Akka 的多线程应用程序。每个线程访问 MySQL 数据库并运行一些计算。每次我运行一组这样的任务时,应用程序的内存占用量都会增加,这主要是由于 JDBC4PreparedStatement 对象永远不会消失。几次运行后,这些对象占用了超过 200MB,很快就会导致内存不足错误,调用 Sytem.gc() 根本不会降低它。

enter image description here

我使用 Hibernate 4.3.0 进行持久化,在 EntityManager 上调用 clear() 也没有帮助,所以并不是说存在持久化对象被存储在任何地方。 This answer意味着可能有 Statement 对象在某处保持打开状态,但我从不直接与 Statement 对象或 Connection 对象交互,而只是与 JPA 交互实体管理器。

这是 MySQL JDBC 或 JPA 的预期行为吗?我怎样才能解决这个内存泄漏? 我不知道在哪里寻找解决方案,不确定这个问题是否是由于 MySQL、JDBC、JPA 或 Hibernate 的实现造成的。或者可能是玩的方式!处理 JPA。

<小时/>

编辑

需要明确的是,我没有使用 ConnectionStatement 对象,因此没有任何需要关闭的内容。下面是一个示例,我在事务中从 Play 获取 EntityManager,执行某些操作,然后提交事务。

        JPA.withTransaction( () -> {
Site site= JPA.em().find(Site.class, siteId);
site.setDomain("www.stackoverflow.com");
});

最佳答案

这是预期的行为。您必须通过设置告诉 mysql 连接返回游标而不是选择完整集:

stmt = conn.createStatement(java.sql.ResultSet.TYPE_FORWARD_ONLY,
java.sql.ResultSet.CONCUR_READ_ONLY);
stmt.setFetchSize(Integer.MIN_VALUE);

根据您的要求,您的具体设置可能与此略有不同,因此可能需要进行一些调整。

关于Java 堆已被 JDBC4PreparedStatement 填满,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36018473/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com