2

我有一个网络服务 - java/hibernate/mysql/innoDB。我不断收到 apperante 死锁异常。我在网上四处寻找,并尝试了建议但仍然有问题......

我在我的休眠 cfg 中使用以下内容:hibernate.cfg:

  <property name="hibernate.connection.driver_class">org.gjt.mm.mysql.Driver</property>
  <property name="connection.autoReconnect">true</property>
  <property name="connection.autoReconnectForPools">true</property>
  <property name="connection.is-connection-validation-required">true</property>
  <property name="hibernate.connection.zeroDateTimeBehavior">convertToNull</property>
  <property name="hibernate.dialect">org.hibernate.dialect.MySQLInnoDBDialect</property>
  <property name="hibernate.show_sql">false</property>
  <property name="hibernate.current_session_context_class">thread</property>
  <property name="hibernate.format_sql">true</property>
  <property name="hibernate.use_sql_comments">true</property>
  <property name="hibernate.query.factory_class">org.hibernate.hql.classic.ClassicQueryTranslatorFactory</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">50</property>
  <property name="hibernate.c3p0.timeout">1800</property>
  <property name="hibernate.c3p0.max_statements">50</property>
  <property name="hibernate.c3p0.acquire_increment">1</property>   
  <!-- this property forces the revalidation of a connection after the given amount of time (in secs) -->
  <!-- it must be set to LESS than the wait_timout setting for the mysql server (this setting defaults to 28800 secs (8 hours)) -->
  <property name="hibernate.c3p0.idle_test_period">2100</property>

c3p0.properties:

c3p0.properties

c3p0.testConnectionOnCheckout=true

c3p0.preferredTestQuery = 选择 1;

我得到以下异常:

[WARN] com.mchange.v2.async.ThreadPoolAsynchronousRunner$DeadlockDetector@1e5161e1 -- APPARENT DEADLOCK!!! Creating emergency threads for unassigned pending tasks!
[WARN] com.mchange.v2.async.ThreadPoolAsynchronousRunner$DeadlockDetector@1e5161e1 -- APPARENT DEADLOCK!!! Complete Status: 
    Managed Threads: 3
    Active Threads: 3
    Active Tasks: 
        com.mchange.v2.resourcepool.BasicResourcePool$AsyncTestIdleResourceTask@60dd0912 (com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#0)
        com.mchange.v2.resourcepool.BasicResourcePool$AsyncTestIdleResourceTask@4f7eae6c (com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#1)
        com.mchange.v2.resourcepool.BasicResourcePool$AsyncTestIdleResourceTask@5ed5d3a (com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#2)
    Pending Tasks: 
        com.mchange.v2.resourcepool.BasicResourcePool$AsyncTestIdleResourceTask@22838de0
        com.mchange.v2.resourcepool.BasicResourcePool$AsyncTestIdleResourceTask@6ad77ed3
Pool thread stack traces:
    Thread[com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#0,5,main]
        java.net.SocketInputStream.socketRead0(Native Method)
        java.net.SocketInputStream.read(SocketInputStream.java:146)
        com.mysql.jdbc.util.ReadAheadInputStream.fill(ReadAheadInputStream.java:114)
        com.mysql.jdbc.util.ReadAheadInputStream.readFromUnderlyingStreamIfNecessary(ReadAheadInputStream.java:161)
        com.mysql.jdbc.util.ReadAheadInputStream.read(ReadAheadInputStream.java:189)
        com.mysql.jdbc.MysqlIO.readFully(MysqlIO.java:2537)
        com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:2990)
        com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:2979)
        com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3520)
        com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1990)
        com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2151)
        com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2619)
        com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2569)
        com.mysql.jdbc.StatementImpl.executeQuery(StatementImpl.java:1521)
        com.mchange.v2.c3p0.impl.NewProxyStatement.executeQuery(NewProxyStatement.java:35)
        com.mchange.v2.c3p0.impl.DefaultConnectionTester.activeCheckConnection(DefaultConnectionTester.java:73)
        com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool$1PooledConnectionResourcePoolManager.testPooledConnection(C3P0PooledConnectionPool.java:374)
        com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool$1PooledConnectionResourcePoolManager.refurbishIdleResource(C3P0PooledConnectionPool.java:310)
        com.mchange.v2.resourcepool.BasicResourcePool$AsyncTestIdleResourceTask.run(BasicResourcePool.java:1999)
        com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread.run(ThreadPoolAsynchronousRunner.java:547)
    Thread[com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#1,5,main]
        java.net.SocketInputStream.socketRead0(Native Method)
        java.net.SocketInputStream.read(SocketInputStream.java:146)
        com.mysql.jdbc.util.ReadAheadInputStream.fill(ReadAheadInputStream.java:114)
        com.mysql.jdbc.util.ReadAheadInputStream.readFromUnderlyingStreamIfNecessary(ReadAheadInputStream.java:161)
        com.mysql.jdbc.util.ReadAheadInputStream.read(ReadAheadInputStream.java:189)
        com.mysql.jdbc.MysqlIO.readFully(MysqlIO.java:2537)
        com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:2990)
        com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:2979)
        com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3520)
        com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1990)
        com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2151)
        com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2619)
        com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2569)
        com.mysql.jdbc.StatementImpl.executeQuery(StatementImpl.java:1521)
        com.mchange.v2.c3p0.impl.NewProxyStatement.executeQuery(NewProxyStatement.java:35)
        com.mchange.v2.c3p0.impl.DefaultConnectionTester.activeCheckConnection(DefaultConnectionTester.java:73)
        com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool$1PooledConnectionResourcePoolManager.testPooledConnection(C3P0PooledConnectionPool.java:374)
        com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool$1PooledConnectionResourcePoolManager.refurbishIdleResource(C3P0PooledConnectionPool.java:310)
        com.mchange.v2.resourcepool.BasicResourcePool$AsyncTestIdleResourceTask.run(BasicResourcePool.java:1999)
        com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread.run(ThreadPoolAsynchronousRunner.java:547)
    Thread[com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#2,5,main]
        java.net.SocketInputStream.socketRead0(Native Method)
        java.net.SocketInputStream.read(SocketInputStream.java:146)
        com.mysql.jdbc.util.ReadAheadInputStream.fill(ReadAheadInputStream.java:114)
        com.mysql.jdbc.util.ReadAheadInputStream.readFromUnderlyingStreamIfNecessary(ReadAheadInputStream.java:161)
        com.mysql.jdbc.util.ReadAheadInputStream.read(ReadAheadInputStream.java:189)
        com.mysql.jdbc.MysqlIO.readFully(MysqlIO.java:2537)
        com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:2990)
        com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:2979)
        com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3520)
        com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1990)
        com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2151)
        com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2619)
        com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2569)
        com.mysql.jdbc.StatementImpl.executeQuery(StatementImpl.java:1521)
        com.mchange.v2.c3p0.impl.NewProxyStatement.executeQuery(NewProxyStatement.java:35)
        com.mchange.v2.c3p0.impl.DefaultConnectionTester.activeCheckConnection(DefaultConnectionTester.java:73)
        com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool$1PooledConnectionResourcePoolManager.testPooledConnection(C3P0PooledConnectionPool.java:374)
        com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool$1PooledConnectionResourcePoolManager.refurbishIdleResource(C3P0PooledConnectionPool.java:310)
        com.mchange.v2.resourcepool.BasicResourcePool$AsyncTestIdleResourceTask.run(BasicResourcePool.java:1999)
        com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread.run(ThreadPoolAsynchronousRunner.java:547)


[WARN] Task com.mchange.v2.resourcepool.BasicResourcePool$AsyncTestIdleResourceTask@60dd0912 (in deadlocked PoolThread) failed to complete in maximum time 60000ms. Trying interrupt().
[WARN] Task com.mchange.v2.resourcepool.BasicResourcePool$AsyncTestIdleResourceTask@4f7eae6c (in deadlocked PoolThread) failed to complete in maximum time 60000ms. Trying interrupt().
[WARN] Task com.mchange.v2.resourcepool.BasicResourcePool$AsyncTestIdleResourceTask@5ed5d3a (in deadlocked PoolThread) failed to complete in maximum time 60000ms. Trying interrupt().
[WARN] com.mchange.v2.async.ThreadPoolAsynchronousRunner$DeadlockDetector@1e5161e1 -- APPARENT DEADLOCK!!! Creating emergency threads for unassigned pending tasks!
[WARN] com.mchange.v2.async.ThreadPoolAsynchronousRunner$DeadlockDetector@1e5161e1 -- APPARENT DEADLOCK!!! Complete Status: 
    Managed Threads: 3
    Active Threads: 3
    Active Tasks: 
        com.mchange.v2.resourcepool.BasicResourcePool$1DestroyResourceTask@555214b9 (com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#0)
        com.mchange.v2.resourcepool.BasicResourcePool$1DestroyResourceTask@7fcea971 (com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#2)
        com.mchange.v2.resourcepool.BasicResourcePool$1DestroyResourceTask@58d67b44 (com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#1)
    Pending Tasks: 
        com.mchange.v2.resourcepool.BasicResourcePool$1DestroyResourceTask@6936daec
        com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask@105ef1eb
        com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask@495c83b2
        com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask@58ca40be
        com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask@4660a77c
Pool thread stack traces:
    Thread[com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#0,5,main]
        com.mysql.jdbc.StatementImpl.close(StatementImpl.java:550)
        com.mchange.v2.c3p0.impl.NewPooledConnection.cleanupUncachedStatements(NewPooledConnection.java:651)
        com.mchange.v2.c3p0.impl.NewPooledConnection.close(NewPooledConnection.java:539)
        com.mchange.v2.c3p0.impl.NewPooledConnection.close(NewPooledConnection.java:234)
        com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool$1PooledConnectionResourcePoolManager.destroyResource(C3P0PooledConnectionPool.java:470)
        com.mchange.v2.resourcepool.BasicResourcePool$1DestroyResourceTask.run(BasicResourcePool.java:964)
        com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread.run(ThreadPoolAsynchronousRunner.java:547)
    Thread[com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#2,5,main]
        com.mysql.jdbc.StatementImpl.close(StatementImpl.java:550)
        com.mchange.v2.c3p0.impl.NewPooledConnection.cleanupUncachedStatements(NewPooledConnection.java:651)
        com.mchange.v2.c3p0.impl.NewPooledConnection.close(NewPooledConnection.java:539)
        com.mchange.v2.c3p0.impl.NewPooledConnection.close(NewPooledConnection.java:234)
        com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool$1PooledConnectionResourcePoolManager.destroyResource(C3P0PooledConnectionPool.java:470)
        com.mchange.v2.resourcepool.BasicResourcePool$1DestroyResourceTask.run(BasicResourcePool.java:964)
        com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread.run(ThreadPoolAsynchronousRunner.java:547)
    Thread[com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#1,5,main]
        com.mysql.jdbc.StatementImpl.close(StatementImpl.java:550)
        com.mchange.v2.c3p0.impl.NewPooledConnection.cleanupUncachedStatements(NewPooledConnection.java:651)
        com.mchange.v2.c3p0.impl.NewPooledConnection.close(NewPooledConnection.java:539)
        com.mchange.v2.c3p0.impl.NewPooledConnection.close(NewPooledConnection.java:234)
        com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool$1PooledConnectionResourcePoolManager.destroyResource(C3P0PooledConnectionPool.java:470)
        com.mchange.v2.resourcepool.BasicResourcePool$1DestroyResourceTask.run(BasicResourcePool.java:964)
        com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread.run(ThreadPoolAsynchronousRunner.java:547)


[WARN] Task com.mchange.v2.resourcepool.BasicResourcePool$1DestroyResourceTask@555214b9 (in deadlocked PoolThread) failed to complete in maximum time 60000ms. Trying interrupt().
[WARN] Task com.mchange.v2.resourcepool.BasicResourcePool$1DestroyResourceTask@7fcea971 (in deadlocked PoolThread) failed to complete in maximum time 60000ms. Trying interrupt().
[WARN] Task com.mchange.v2.resourcepool.BasicResourcePool$1DestroyResourceTask@58d67b44 (in deadlocked PoolThread) failed to complete in maximum time 60000ms. Trying interrupt().
4

1 回答 1

1

你想做什么?在我看来,有一些东西可以让你的数据库连接保持打开状态。结果 c3p0 试图获得更多的连接来处理额外的请求。

于 2012-07-26T12:27:26.610 回答