我们在Hibernate中使用c3p0作为池化库,配置如下。我们怀疑这个库可能存在内存泄漏。我们转储应用程序的内存堆,显示有一个类型为 "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")
先谢谢您的帮助!
是的,这可能真的是一个bug。我建议把你的问题报告给我们 此处.
三个提示。
在我看来,HikariCP也比c3p0更容易预测和使用。当然,你还有其他的连接池库。DBCP, Tomcat pooling, BoneCP, Proxool等等. 你可以尝试其中的一些,然后选择适合你的应用。
所以基本上你有两个选择,关闭 c3p0 中的 JDBC 语句缓存并等待修复(或者独立修复并创建 Pull Request),或者尝试一些替代方案。