如何摆脱 c3p0 死锁错误
how to get rid of c3p0 deadlock error
我将休眠 4.3.6 与 c3p0 0.9.2.1 一起使用,但我经常遇到以下错误:
ThreadPoolAsynchronousRunner:778 - com.mchange.v2.async.ThreadPoolAsynchronousRunner$DeadlockDetector@9abc33e -- Running DeadlockDetector[Exiting. No pending tasks.]
这会降低服务器速度,我不知道是什么原因造成的,也不知道如何解决它。
这是我的 hibernate.config 文件:
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql://ip:port/app?autoReconnect=true&useUnicode=true&createDatabaseIfNotExist=true&characterEncoding=utf-8</property>
<property name="hibernate.connection.username">username</property>
<property name="hibernate.connection.password">password</property>
<property name="hibernate.connection.isolation">2</property>
<property name="show_sql">true</property>
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="hibernate.hbm2ddl.auto">update</property>
<property name="hibernate.connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property>
<property name="hibernate.c3p0.min_size">5</property>
<property name="hibernate.c3p0.max_size">100</property>
<property name="hibernate.c3p0.timeout">300</property>
<property name="hibernate.c3p0.max_statements">50</property>
<property name="hibernate.c3p0.idle_test_period">3000</property>
<mapping class="server.c1"/>
<mapping class="server.c2"/>
<mapping class="server.c3"/>
<mapping class="server.c4"/>
<mapping class="server.c5"/>
</session-factory>
</hibernate-configuration>
另外我还有一个c3p0.properties文件:
c3p0.testConnectionOnCheckout=true
c3p0.privilegeSpawnedThreads=true
c3p0.contextClassLoaderSource=library
有很多关于它的问题,但我找不到具体的解决方案。
我对 c3p0 也有类似的问题。我的最终解决方案是使用此连接池 https://github.com/brettwooldridge/HikariCP
如果您仍在使用 c3p0,则以下步骤可能会解决此问题:
- 更新到最新的 c3p0(现在是 0.9.5.2)。
设置以下配置参数:
c3p0.statementCacheNumDeferredCloseThreads=1
参见docs。
更新:哦,等等。我反应太快了。抱歉!
您实际上并没有看到死锁,您只是看到死锁检测器是 运行 的消息。您看到的消息根本不是错误,只是在 TRACE
/ DEBUG
/ FINEST
处记录的通知(取决于您使用的日志记录库)。
您应该配置您的日志记录,以便前缀为 com.mchange
的记录器在 INFO
处登录。就是这样。
我将休眠 4.3.6 与 c3p0 0.9.2.1 一起使用,但我经常遇到以下错误:
ThreadPoolAsynchronousRunner:778 - com.mchange.v2.async.ThreadPoolAsynchronousRunner$DeadlockDetector@9abc33e -- Running DeadlockDetector[Exiting. No pending tasks.]
这会降低服务器速度,我不知道是什么原因造成的,也不知道如何解决它。
这是我的 hibernate.config 文件:
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql://ip:port/app?autoReconnect=true&useUnicode=true&createDatabaseIfNotExist=true&characterEncoding=utf-8</property>
<property name="hibernate.connection.username">username</property>
<property name="hibernate.connection.password">password</property>
<property name="hibernate.connection.isolation">2</property>
<property name="show_sql">true</property>
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="hibernate.hbm2ddl.auto">update</property>
<property name="hibernate.connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property>
<property name="hibernate.c3p0.min_size">5</property>
<property name="hibernate.c3p0.max_size">100</property>
<property name="hibernate.c3p0.timeout">300</property>
<property name="hibernate.c3p0.max_statements">50</property>
<property name="hibernate.c3p0.idle_test_period">3000</property>
<mapping class="server.c1"/>
<mapping class="server.c2"/>
<mapping class="server.c3"/>
<mapping class="server.c4"/>
<mapping class="server.c5"/>
</session-factory>
</hibernate-configuration>
另外我还有一个c3p0.properties文件:
c3p0.testConnectionOnCheckout=true
c3p0.privilegeSpawnedThreads=true
c3p0.contextClassLoaderSource=library
有很多关于它的问题,但我找不到具体的解决方案。
我对 c3p0 也有类似的问题。我的最终解决方案是使用此连接池 https://github.com/brettwooldridge/HikariCP
如果您仍在使用 c3p0,则以下步骤可能会解决此问题:
- 更新到最新的 c3p0(现在是 0.9.5.2)。
设置以下配置参数:
c3p0.statementCacheNumDeferredCloseThreads=1
参见docs。
更新:哦,等等。我反应太快了。抱歉!
您实际上并没有看到死锁,您只是看到死锁检测器是 运行 的消息。您看到的消息根本不是错误,只是在 TRACE
/ DEBUG
/ FINEST
处记录的通知(取决于您使用的日志记录库)。
您应该配置您的日志记录,以便前缀为 com.mchange
的记录器在 INFO
处登录。就是这样。