PoolablePreparedStatement内存泄漏

时间:2019-03-21 10:19:03

标签: java spring

我有一个程序,可以在数据库上执行很多更新语句。 每次将一个对象(每个对象多次插入和更新)导入数据库时​​,程序都会变慢。最初,每个对象只需花费几毫秒,最后大约需要2到3秒钟。

我无法粘贴代码,因为我不知道到底是什么原因造成的。

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

enter image description here

  

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

加载      

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

很多方法都使用注释

@Transactional(propagation = Propagation.REQUIRED)

有人可以解释这种行为或给我提示吗?

1 个答案:

答案 0 :(得分:0)

我发现了问题:有一个语句在查询字符串中包含一个参数。我将其提取并放置在其他位置,现在它保持快速运行。

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...*/);

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