我有一个程序,可以在数据库上执行很多更新语句。 每次将一个对象(每个对象多次插入和更新)导入数据库时,程序都会变慢。最初,每个对象只需花费几毫秒,最后大约需要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 $ Node []”,由“”
加载关键字java.util.concurrent.ConcurrentHashMap $ Node [] org.apache.commons.dbcp2.PoolablePreparedStatement sun.misc.Launcher $ AppClassLoader @ 0x5c0e60e88
很多方法都使用注释
@Transactional(propagation = Propagation.REQUIRED)
有人可以解释这种行为或给我提示吗?
答案 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...*/);
似乎地图中保存了很多语句,以至于每次迭代该程序的速度都会越来越慢