我们使用 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")
预先感谢您的帮助!
最佳答案
是的,它确实可能是一个错误。我建议报告你的问题 here .
三个提示:
- 语句缓存在 c3p0 中默认禁用。我想你能猜出原因。
- c3p0 太容易配置错误。
- c3p0 是一个(相当)成熟的库,但不幸的是,它也远不是当今 JDBC 连接池的最佳选择。我真的建议你尝试更快更可靠 HikariCP .
在我看来,HikariCP 也比 c3p0 更可预测且更易于使用。当然,您还可以使用其他连接池库:DBCP、Tomcat 池、BoneCP、Proxool 等。您可以尝试其中的一些,然后选择适合您应用的那个。
所以基本上您有两个选择,关闭 c3p0 中的 JDBC 语句缓存并等待修复(或独立修复并创建 Pull Request)或尝试其他选择。
关于java - Hibernate 中的 c3p0 中可能存在内存泄漏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34027479/