Hibernate中的c3p0可能存在内存泄漏?

问题描述 投票:1回答:1

我们在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")

先谢谢您的帮助!

java mysql hibernate memory-leaks c3p0
1个回答
0
投票

是的,这可能真的是一个bug。我建议把你的问题报告给我们 此处.

三个提示。

  1. 语句缓存是默认的 残疾 在c3p0。我想你能猜到原因。
  2. c3p0太容易被错误配置了。
  3. c3p0是一个(相当)成熟的库,但不幸的是,它也远不是现在JDBC连接池的最佳选择。我真的建议你尝试更快、更可靠的 HikariCP.

在我看来,HikariCP也比c3p0更容易预测和使用。当然,你还有其他的连接池库。DBCP, Tomcat pooling, BoneCP, Proxool等等. 你可以尝试其中的一些,然后选择适合你的应用。

所以基本上你有两个选择,关闭 c3p0 中的 JDBC 语句缓存并等待修复(或者独立修复并创建 Pull Request),或者尝试一些替代方案。

© www.soinside.com 2019 - 2024. All rights reserved.