我在 Linux 环境下使用 Tomcat,在 Java Web 应用程序中做了一个将 Hibernate 和 Spring 合并的项目。由于 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
有谁知道为什么会发生这种情况以及如何解决这个问题?
非常感谢。