2012-07-26 96 views
2

我有一個webservice - java/hibernate/mysql/innoDB。 我不斷收到apperante死鎖異常。 我環顧四周淨,並試圖什麼建議,但仍然有問題...java + hibernate webservice - 外掛死鎖

我使用下面我休眠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 =真

c3p0.preferredTest查詢= SELECT 1;

我得到以下異常:

[WARN] com[email protected]1e5161e1 -- APPARENT DEADLOCK!!! Creating emergency threads for unassigned pending tasks! 
[WARN] com[email protected]1e5161e1 -- APPARENT DEADLOCK!!! Complete Status: 
    Managed Threads: 3 
    Active Threads: 3 
    Active Tasks: 
     com.mcha[email protected]60dd0912 (com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#0) 
     com.mcha[email protected]4f7eae6c (com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#1) 
     com.mcha[email protected]5ed5d3a (com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#2) 
    Pending Tasks: 
     com.mcha[email protected]22838de0 
     com.mcha[email protected]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.mcha[email protected]60dd0912 (in deadlocked PoolThread) failed to complete in maximum time 60000ms. Trying interrupt(). 
[WARN] Task com.mcha[email protected]4f7eae6c (in deadlocked PoolThread) failed to complete in maximum time 60000ms. Trying interrupt(). 
[WARN] Task com.mcha[email protected]5ed5d3a (in deadlocked PoolThread) failed to complete in maximum time 60000ms. Trying interrupt(). 
[WARN] com[email protected]1e5161e1 -- APPARENT DEADLOCK!!! Creating emergency threads for unassigned pending tasks! 
[WARN] com[email protected]1e5161e1 -- APPARENT DEADLOCK!!! Complete Status: 
    Managed Threads: 3 
    Active Threads: 3 
    Active Tasks: 
     com[email protected]555214b9 (com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#0) 
     com[email protected]7fcea971 (com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#2) 
     com[email protected]58d67b44 (com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#1) 
    Pending Tasks: 
     com[email protected]6936daec 
     [email protected]eb 
     [email protected]b2 
     [email protected]be 
     [email protected]7c 
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[email protected]555214b9 (in deadlocked PoolThread) failed to complete in maximum time 60000ms. Trying interrupt(). 
[WARN] Task com[email protected]7fcea971 (in deadlocked PoolThread) failed to complete in maximum time 60000ms. Trying interrupt(). 
[WARN] Task com[email protected]58d67b44 (in deadlocked PoolThread) failed to complete in maximum time 60000ms. Trying interrupt(). 
+1

死鎖是一個SQL編程問題,而不是連接池相關的問題。死鎖是當進程1正在鎖定表A並且正在等待鎖定表B並且進程2正在鎖定表B並且正在等待A. – 2012-07-26 12:28:38

回答

1

你到底想幹什麼?對我來說,有一些東西可以讓你的數據庫連接保持打開狀態。因此,c3p0正試圖獲得更多連接來處理額外的請求。

+0

這很奇怪你在說什麼,因爲我在代碼中需要使用session.commit() 。所以連接應該關閉。我對麼? – user1365799 2012-07-26 12:29:37

+0

session.commit()不會關閉您的數據庫連接。您是否正在使用您從未提交或回滾的交易? – 2012-07-26 12:31:22

+0

我所有的事務都在提交/回滾。每個ServerAPI函數獲取事務並始終提交/回滾。如果我需要提供更多有助於解決的信息 - 將很樂意提供 – user1365799 2012-07-26 12:36:23