Hibernate中c3p0可能出现内存泄漏?

时间:2015-12-01 18:28:44

标签: java mysql hibernate memory-leaks c3p0

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

提前感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

是的,它确实是一个错误。我建议您报告问题here

三个提示:

  1. c3p0中的语句缓存默认为禁用。我想你可以猜到为什么。
  2. c3p0太容易错误配置。
  3. c3p0是一个(相当)成熟的库,但遗憾的是,它现在还远远不是JDBC连接池的最佳选择。我真的建议你尝试更快,更可靠HikariCP
  4. 恕我直言HikariCP也比c3p0更易于预测和使用。当然,您还有其他连接池库:DBCP,Tomcat池,BoneCP,Proxool等。您可以尝试其中一些并选择适合您应用的库。

    所以基本上你有两个选择,在c3p0中关闭jdbc语句缓存并等待修复(或者单独修复它并创建Pull Request)或尝试其他选择。
    不过,祝你好运:)