我们使用c3p0作为Hibernate中的池库,具有以下配置。我们怀疑此库中可能存在内存泄漏。我们转储应用程序的内存堆,它显示一个类型为“com.mchange.v2.c3p0.stmt.GlobalMaxOnlyStatementCache”的对象使用2.2GB内存(占总数的61.6%)并继续增长直到内存不足。据我所知,这个类用于缓存PreparedStatements。我们的配置使用100作为此值,这意味着最多应缓存100个语句。
configuration
.setProperty("hibernate.c3p0.max_size", "25")
.setProperty("hibernate.c3p0.min_size", "2")
.setProperty("hibernate.c3p0.initial_pool_size", "2")
.setProperty("hibernate.c3p0.timeout", "3600")
.setProperty("hibernate.c3p0.max_statements", "100")
.setProperty("hibernate.c3p0.idle_test_period", "300")
.setProperty("hibernate.c3p0.acquire_increment", "2")
.setProperty("hibernate.c3p0.maxConnectionAge", "3600")
.setProperty("hibernate.c3p0.numHelperThreads", "6")
提前感谢您的帮助!
答案 0 :(得分:0)
是的,它确实是一个错误。我建议您报告问题here。
三个提示:
恕我直言HikariCP也比c3p0更易于预测和使用。当然,您还有其他连接池库:DBCP,Tomcat池,BoneCP,Proxool等。您可以尝试其中一些并选择适合您应用的库。
所以基本上你有两个选择,在c3p0中关闭jdbc语句缓存并等待修复(或者单独修复它并创建Pull Request)或尝试其他选择。
不过,祝你好运:)