Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/384.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用带有Hibernate/Spring的C3P0创建的许多线程_Java_Mysql_Multithreading_Hibernate_C3p0 - Fatal编程技术网

Java 使用带有Hibernate/Spring的C3P0创建的许多线程

Java 使用带有Hibernate/Spring的C3P0创建的许多线程,java,mysql,multithreading,hibernate,c3p0,Java,Mysql,Multithreading,Hibernate,C3p0,我在Linux环境下使用Tomcat在Java web应用程序中合并Hibernate和Spring。由于Mysql 8小时超时问题,我们希望使用C3P0管理Mysql数据库的连接池。 但是当我们使用它时,我们会创建许多线程。我找到了答案,因为我在每个请求上都打印了所有这些请求的内存状态,显示了不断增加的内存和类似的线程: 名称:C3P0PooledConnectionPoolManager[identityToken->1hged7o8r13kpj7n1h3ycia | 39c446]-He

我在Linux环境下使用Tomcat在Java web应用程序中合并Hibernate和Spring。由于Mysql 8小时超时问题,我们希望使用C3P0管理Mysql数据库的连接池。 但是当我们使用它时,我们会创建许多线程。我找到了答案,因为我在每个请求上都打印了所有这些请求的内存状态,显示了不断增加的内存和类似的线程:

  • 名称:C3P0PooledConnectionPoolManager[identityToken->1hged7o8r13kpj7n1h3ycia | 39c446]-HelperThread-#0守护进程:真组!主组父级:系统活动:true中断:false
  • 名称:C3P0PooledConnectionPoolManager[identityToken->1hged7o8r13kpj7n1h3ycia | 17ec0e8]-AdminTaskTimer守护程序:真组!主组父级:系统活动: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.minPoolSize
c3p0.maxPoolSize
,最大值为10

numHelperThreads和maxAdministrativeTaskTime有助于配置数据源线程池的行为。默认情况下,每个数据源只有三个关联的辅助线程。。如果在重载情况下性能似乎有所下降,或者如果您通过JMX或直接检查PooledDataSource来观察,则“挂起的任务”通常大于零,请尝试增加numHelperThreads。maxAdministrativeTaskTime对于遇到无限期挂起的任务和“明显死锁”消息的用户可能很有用。(有关更多信息,请参阅附录A。)

numHelperThreads定义每个数据源使用的线程数,因此实际上您将有10个
numHelperThreads=1
的线程

确保C3P0只使用一个线程的唯一方法是设置
C3P0.minPoolSize

c3p0.maxPoolSize
为1,但这违背了连接池的目的。

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

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


祝你好运

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

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

多亏了大家

如果我设置“c3p0.numHelperThreads=0”,我的请求永远不会结束,默认值为3。您可以尝试,但我希望有些东西不起作用,我希望这些线程可以为您监视连接的状态,也许可以做更多。我尝试了“c3p0.numHelperThreads=3”和“c3p0.maxAdministrativeTaskTime=10”没有什么变化,只是增加了线程的数量。记住,它将根据负载启动连接和螺纹。如果您只是在没有任何工作负载的情况下初始化它(创建许多连接等),那么它可能无法启动它们。您好,这里有一点错误。numHelperThreads是每个数据源而不是每个连接创建的线程数。numHelperThreads=1通常不是一个好主意。添加IDLECONNECTONTESTPERIOD=1过于激进。我不推荐。
    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