【问题标题】:Many threads created using C3P0 with Hibernate/Spring使用 C3P0 和 Hibernate/Spring 创建的许多线程
【发布时间】:2012-11-30 04:13:00
【问题描述】:

我做了一个项目,将 Hibernate 和 Spring 合并到一个 Java Web 应用程序中,在 Linux 环境下使用 Tomcat。由于 Mysql 8 小时超时问题,我们想使用 C3P0 来管理与我们的 Mysql 数据库的连接池。 但是当我们使用它时,我们会创建许多线程。我想通了,因为我在每个请求上都打印了所有的内存状态,向我展示了不断增加的内存和那种线程:

  • 名称:C3P0PooledConnectionPoolManager[identityToken->1hged7o8r13kpj7n1h3ycia|39c446]-HelperThread-#0 守护进程:真正的组! main groupParent:系统存活:true 中断:false
  • 名称:C3P0PooledConnectionPoolManager[identityToken->1hged7o8r13kpj7n1h3ycia|17ec0e8]-AdminTaskTimer 守护进程:真正的组! main groupParent:系统存活:true 中断:false

经过足够的时间,它可以产生超过 500 个这样的线程。

这是我的 Hibernate.cfg.xml:

    <property name="connection.provider_class">
            org.hibernate.connection.C3P0ConnectionProvider</property>
    <property name="hibernate.c3p0.acquire_increment">1</property> 
    <property name="hibernate.c3p0.idle_test_period">5</property>
    <property name="hibernate.c3p0.max_size">100</property> 
    <property name="hibernate.c3p0.max_statements">100</property> 
    <property name="hibernate.c3p0.min_size">10</property> 
    <property name="hibernate.c3p0.timeout">5</property>

    <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
    <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
    <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/myBase</property>
    <property name="hibernate.connection.username">root</property>
    <property name="hibernate.connection.password"></property>
    <property name="hibernate.hbm2ddl.auto">update</property>
    <property name="hibernate.default_schema">myProject</property>
    <property name="hibernate.query.factory_class">org.hibernate.hql.classic.ClassicQueryTranslatorFactory</property>
    <property name="show_sql">false</property>

    <property name="cache.provider_class">
      org.hibernate.cache.NoCacheProvider
    </property>         

我也尝试添加一个 C3P0 属性文件,但除了减少辅助线程数之外,它不会删除未使用的线程:

    c3p0.maxStatements=5    

c3p0.maxIdleTime=10

c3p0.numHelperThreads=1

c3p0.testConnectionOnCheckout=true
c3p0.preferredTestQuery=SELECT 1

c3p0.initialPoolSize=1
c3p0.minPoolSize=1
c3p0.maxPoolSize=10

c3p0.acquireIncrement=1
c3p0.idleConnectionTestPeriod=1

有没有人知道为什么会发生这种情况以及如何解决这个问题?

非常感谢。

【问题讨论】:

    标签: java mysql multithreading hibernate c3p0


    【解决方案1】:

    我希望它创建与c3p0.minPoolSize 成比例的线程数 和c3p0.maxPoolSize,你的最大值是10。

    http://www.mchange.com/projects/c3p0/#other_ds_configuration "numHelperThreads 和 maxAdministrativeTaskTime 有助于配置 DataSource 线程池的行为。默认情况下,每个 DataSource 只有三个关联的辅助线程。如果在重负载下性能似乎拖累,或者如果您通过 JMX 或直接检查 PooledDataSource 观察到“待处理任务”的数量通常大于零,请尝试增加 numHelperThreads。maxAdministrativeTaskTime 对于遇到任务无限期挂起和“APPARENT DEADLOCK”消息的用户可能很有用。(请参阅附录 A 了解更多信息。)"

    numHelperThreads 定义了每个 DataSource 使用了多少线程,因此实际上您将有 10 个线程使用 numHelperThreads=1

    确保 C3P0 只消耗一个线程的唯一方法是设置c3p0.minPoolSizec3p0.maxPoolSize 为1,但这违背了连接池的目的。

    【讨论】:

    • 如果我设置“c3p0.numHelperThreads=0”,我的请求永远不会结束,默认值为 3。
    • 你可以尝试,但我希望有些东西不起作用,我希望这些线程为你监控连接状态,也许还能做更多。
    • 我尝试了“c3p0.numHelperThreads=3”和“c3p0.maxAdministrativeTaskTime=10”,但没有任何改变
    • 您刚刚增加了线程数。请记住,它将根据负载启动连接和线程。如果您只是在没有任何工作负载(创建许多连接等)的情况下初始化它,那么它可能不会启动它们。
    • 嗨,这里有点错误。 numHelperThreads 是每个数据源而不是每个连接创建的线程数。 numHelperThreads=1 通常不是一个好主意。
    【解决方案2】:

    如果您看到 c3p0 助手和计时器线程的倍增,那么当您希望只有一个时,您会以某种方式创建大量 c3p0 数据源。有时,如果您正在热重新加载您的应用程序但在回收时忘记关闭()旧的 c3p0 数据源,则会发生这种情况。

    实际上看起来您正在“泄漏”数据源。您需要弄清楚发生这种情况的原因/地点。有关一些线索,请查看您的日志以获取信息级别的 c3p0 数据源初始化消息。例如,搜索字符串“Initializing c3p0 pool”。

    祝你好运!

    【讨论】:

      【解决方案3】:

      好的,我找到了一个属性组合来解决我的问题,请记住,我一次不需要很多连接:

      • c3p0.maxStatements=5
      • c3p0.maxIdleTime=10
      • c3p0.numHelperThreads=3
      • c3p0.testConnectionOnCheckout=true
      • c3p0.preferredTestQuery=SELECT 1
      • c3p0.initialPoolSize=1
      • c3p0.minPoolSize=1
      • c3p0.maxPoolSize=1 c3p0.acquireIncrement=1
      • c3p0.idleConnectionTestPeriod=1
      • c3p0.maxAdministrativeTaskTime=1

      谢谢大家

      【讨论】:

      • 添加 idleConnectionTestPeriod=1 太激进了。我不会推荐它。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-06-30
      • 2013-03-06
      • 2011-07-31
      • 1970-01-01
      • 2014-02-09
      • 2010-12-03
      • 1970-01-01
      相关资源
      最近更新 更多