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

标签 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")

预先感谢您的帮助!

最佳答案

是的,它确实可能是一个错误。我建议报告你的问题 here .

三个提示:

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

在我看来,HikariCP 也比 c3p0 更可预测且更易于使用。当然,您还可以使用其他连接池库:DBCP、Tomcat 池、BoneCP、Proxool 等。您可以尝试其中的一些,然后选择适合您应用的那个。

所以基本上您有两个选择,关闭 c3p0 中的 JDBC 语句缓存并等待修复(或独立修复并创建 Pull Request)或尝试其他选择。

关于java - Hibernate 中的 c3p0 中可能存在内存泄漏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34027479/

相关文章:

java - HQL 中的内联表达式

java - Android Studio : Countdown timer which is also running when the app is closed

java - 日期文本框应始终为当前月份的第一个日期。?

java - SQLite - 选择文本并获取 Codename One for Java 中文本字段的值

java - Spring Integration - DSL - 拆分或 fork

MySQL复式记账系统数据库设计?

java - 关于创建 OnetoMany、ManyToOne 映射的 Hibernate 问题给出 null

java - 将 Hibernate 3 升级到 Hibernate 4.3

php - php codeigniter 中使用 join/concat 的 mysql 查询结果

c++ - 从 C 或 C++ 连接到 MySQL