Java PoolablePreparedStatement内存泄漏

Java PoolablePreparedStatement内存泄漏,java,spring,Java,Spring,我有一个程序,它在数据库上执行许多update语句。 每次将对象(每个对象有多个插入和更新)导入数据库时,程序都会变慢。一开始,每个对象只需要几毫秒,最后大约需要2到3秒 我无法粘贴代码,因为我不知道到底是什么原因导致了这种情况 我分析了堆转储,它说有很多PoolablePreparedStatement类的实例 155.418“org.apache.commons.dbcp2.PoolablePreparedStatement”的实例,由 “sun.misc.Launcher$AppClas

我有一个程序,它在数据库上执行许多update语句。 每次将对象(每个对象有多个插入和更新)导入数据库时,程序都会变慢。一开始,每个对象只需要几毫秒,最后大约需要2到3秒

我无法粘贴代码,因为我不知道到底是什么原因导致了这种情况

我分析了堆转储,它说有很多PoolablePreparedStatement类的实例

155.418“org.apache.commons.dbcp2.PoolablePreparedStatement”的实例,由 “sun.misc.Launcher$AppClassLoader@0x5c0e60e88”占据1.831.282.544 (77,16%)字节。这些实例引用自的一个实例 “java.util.concurrent.ConcurrentHashMap$节点[]”,由“”加载

关键词java.util.concurrent.ConcurrentHashMap$Node[] org.apache.commons.dbcp2.PoolablePreparedStatement sun.misc.Launcher$AppClassLoader@0x5c0e60e88

许多方法都使用注释

@Transactional(propagation = Propagation.REQUIRED)

有人能解释一下这种行为或给我一个提示吗?

我发现了问题:有一条语句的查询字符串中包含了一个参数。我把它提取出来,放在其他人的地方,现在它保持快速

template.update("UPDATE table SET x = ?, y = ?, z = '" + somethingUnique + "' WHERE id = ? ", /*the args...*/);
改为

template.update("UPDATE table SET x = ?, y = ?, z = ? WHERE id = ? ", /*the args...*/);

地图中似乎保存了太多语句,以至于程序每次迭代都会越来越慢

您的spring版本是什么,为什么不使用Hikari?它是spring 4.1.1。我不知道Hikari。这有什么帮助?这是我必须优化的遗留代码。这是一个不可关闭的可关闭资源。或者你有一个没有出口的环路。你不需要Hikari。该插件非常有用,因为它可以为您管理db连接池。DBCP2是一个连接池,但如前所述,您可能希望尝试HikariCP作为替代方案,并可能更好地实现。也就是说,请发布一些正在进行更新/插入的代码。它是一个在一个大事务中完成所有事情的批处理过程吗?是否涉及JPA等?