Hibernate 中的 c3p0 中可能存在内存泄漏?
Possible memory leak in c3p0 in Hibernate?
我们使用 c3p0 作为 Hibernate 中的池库,配置如下。我们怀疑这个库中可能存在内存泄漏。我们转储应用程序的内存堆,它显示类型 "com.mchange.v2.c3p0.stmt.GlobalMaxOnlyStatementCache" 的一个对象使用 2.2GB 内存(占全部内存的 61.6%),并且它继续增长直到内存耗尽。据我了解,这个 class 用于缓存 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 pooling、BoneCP、Proxool 等。您可以尝试其中的一些,然后选择适合您的应用程序的库。
所以基本上你有两个选择,关闭 c3p0 中的 JDBC 语句缓存并等待修复(或独立修复它并创建 Pull Request)或尝试一些替代方法。
我们使用 c3p0 作为 Hibernate 中的池库,配置如下。我们怀疑这个库中可能存在内存泄漏。我们转储应用程序的内存堆,它显示类型 "com.mchange.v2.c3p0.stmt.GlobalMaxOnlyStatementCache" 的一个对象使用 2.2GB 内存(占全部内存的 61.6%),并且它继续增长直到内存耗尽。据我了解,这个 class 用于缓存 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 pooling、BoneCP、Proxool 等。您可以尝试其中的一些,然后选择适合您的应用程序的库。
所以基本上你有两个选择,关闭 c3p0 中的 JDBC 语句缓存并等待修复(或独立修复它并创建 Pull Request)或尝试一些替代方法。