2014-09-12 107 views
2

我已經配置Tomcat使用ComboPooledDataSource,通過在我的context.xml中添加以下內容。Tomcat使用c3p0數據源,maxPoolSize超過

<Resource 
    name="jdbc/abcdatasource" 
    auth="Container" 
    type="com.mchange.v2.c3p0.ComboPooledDataSource" 
    factory="org.apache.naming.factory.BeanFactory" 
    maxPoolSize="20" 
    minPoolSize="5" 
    maxIdleTime="3000" 
    acquireIncrement="1" 
    user="abc" 
    password="pw_here" 
    driverClass="oracle.jdbc.driver.OracleDriver" 
    jdbcUrl="jdbc:oracle:thin:@abc.def.ghi.net:1521:BLAH" 
/> 

我想限制數據庫連接爲20,如maxPoolSize中所定義的,但是我的打開的連接數超過了這個數。例如,昨天我有35個打開的連接。我的日誌正在捕獲以下內容。

2014-09-11 00:37:47,077 INFO [com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#2] NewPooledConnection:725 - - [c3p0] Exceptions occurred while trying to close a PooledConnection's resources normally. 
2014-09-11 00:37:47,077 INFO [com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#2] NewPooledConnection:735 - - [c3p0] NewPooledConnection close Exception. 
java.sql.SQLException: Io exception: Connection timed out 
     at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:112) 
     at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:146) 
     at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:255) 
     at oracle.jdbc.driver.T4CConnection.logoff(T4CConnection.java:481) 
     at oracle.jdbc.driver.PhysicalConnection.close(PhysicalConnection.java:1203) 
     at com.mchange.v2.c3p0.impl.NewPooledConnection.close(NewPooledConnection.java:549) 
     at com.mchange.v2.c3p0.impl.NewPooledConnection.close(NewPooledConnection.java:234) 
     at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool$1PooledConnectionResourcePoolManager.destroyResource(C3P0PooledConnectionPool.java:470) 
     at com.mchange.v2.resourcepool.BasicResourcePool$1DestroyResourceTask.run(BasicResourcePool.java:964) 
     at com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread.run(ThreadPoolAsynchronousRunner.java:547) 
2014-09-11 00:37:47,078 WARN [com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#2] BasicResourcePool:972 - - Failed to destroy resource: [email protected] 
java.sql.SQLException: Some resources failed to close properly while closing [email protected] 
     at com.mchange.v2.c3p0.impl.NewPooledConnection.close(NewPooledConnection.java:571) 
     at com.mchange.v2.c3p0.impl.NewPooledConnection.close(NewPooledConnection.java:234) 
     at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool$1PooledConnectionResourcePoolManager.destroyResource(C3P0PooledConnectionPool.java:470) 
     at com.mchange.v2.resourcepool.BasicResourcePool$1DestroyResourceTask.run(BasicResourcePool.java:964) 
     at com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread.run(ThreadPoolAsynchronousRunner.java:547) 

鑑於此信息,我的打開連接超過了maxPoolSize的可能原因是什麼?

我知道有相關的stackoverflow線程,如herehere,但我不清楚問題可能在我的情況。在這些類似的線程中,有多個連接池 - 但我希望有一個獨特的連接池,當我將Web應用程序容器配置爲使用c3p0 ComboPooledDataSource時。也許我錯過了那裏的東西...

任何幫助將非常感謝!!!!!

編輯1:對於一些額外的上下文,這不是一個新的應用程序。它已經運行多年。然而,新的東西是使用Tomcat和c3p0數據源。從WebLogic轉換到Tomcat後發生此問題。

編輯2:我最初創建這篇文章時未能提供可能非常有用的日誌信息。在log4j中捕獲的DEADLOCK問題如下所示。自從我注意到這個問題以來,我一直在密切關注連接,並且連接增加似乎與死鎖問題有關。如果我不得不猜測,我會說它是在死鎖之後創建一個新的連接池。

2014-09-11 11:36:45,320 WARN [Timer-0] ThreadPoolAsynchronousRunner:608 - - com[email protected]1c203f2b -- APPARENT DEADLOCK!!! Creating emergency threads for unassigned pending tasks! 
2014-09-11 11:36:45,323 WARN [Timer-0] ThreadPoolAsynchronousRunner:624 - - com[email protected]1c203f2b -- APPARENT DEADLOCK!!! Complete Status: 
     Managed Threads: 3 
     Active Threads: 3 
     Active Tasks: 
       com[email protected]4a50503d (com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#2) 
       com[email protected]5ec3fae8 (com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#0) 
       com[email protected]148dc5f3 (com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#1) 
     Pending Tasks: 
       com[email protected]67bedf0f 
       com[email protected]242686ff 
       [email protected]e3 
       [email protected]fe 
       [email protected]4c 
       [email protected]c 
       [email protected]9 
Pool thread stack traces: 
     Thread[com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#2,5,main] 
       java.net.SocketInputStream.socketRead0(Native Method) 
       java.net.SocketInputStream.read(SocketInputStream.java:129) 
       oracle.net.ns.Packet.receive(Unknown Source) 
       oracle.net.ns.DataPacket.receive(Unknown Source) 
       oracle.net.ns.NetInputStream.getNextPacket(Unknown Source) 
       oracle.net.ns.NetInputStream.read(Unknown Source) 
       oracle.net.ns.NetInputStream.read(Unknown Source) 
       oracle.net.ns.NetInputStream.read(Unknown Source) 
       oracle.jdbc.driver.T4CMAREngine.unmarshalUB1(T4CMAREngine.java:1104) 
       oracle.jdbc.driver.T4CMAREngine.unmarshalSB1(T4CMAREngine.java:1075) 
       oracle.jdbc.driver.T4C7Ocommoncall.receive(T4C7Ocommoncall.java:106) 
       oracle.jdbc.driver.T4CConnection.logoff(T4CConnection.java:465) 
       oracle.jdbc.driver.PhysicalConnection.close(PhysicalConnection.java:1203) 
       com.mchange.v2.c3p0.impl.NewPooledConnection.close(NewPooledConnection.java:549) 
       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-#0,5,main] 
       java.net.SocketInputStream.socketRead0(Native Method) 
       java.net.SocketInputStream.read(SocketInputStream.java:129) 
       oracle.net.ns.Packet.receive(Unknown Source) 
       oracle.net.ns.DataPacket.receive(Unknown Source) 
       oracle.net.ns.NetInputStream.getNextPacket(Unknown Source) 
       oracle.net.ns.NetInputStream.read(Unknown Source) 
       oracle.net.ns.NetInputStream.read(Unknown Source) 
       oracle.net.ns.NetInputStream.read(Unknown Source) 
       oracle.jdbc.driver.T4CMAREngine.unmarshalUB1(T4CMAREngine.java:1104) 
       oracle.jdbc.driver.T4CMAREngine.unmarshalSB1(T4CMAREngine.java:1075) 
       oracle.jdbc.driver.T4C7Ocommoncall.receive(T4C7Ocommoncall.java:106) 
       oracle.jdbc.driver.T4CConnection.logoff(T4CConnection.java:465) 
       oracle.jdbc.driver.PhysicalConnection.close(PhysicalConnection.java:1203) 
       com.mchange.v2.c3p0.impl.NewPooledConnection.close(NewPooledConnection.java:549) 
       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] 
       java.net.SocketInputStream.socketRead0(Native Method) 
       java.net.SocketInputStream.read(SocketInputStream.java:129) 
       oracle.net.ns.Packet.receive(Unknown Source) 
       oracle.net.ns.DataPacket.receive(Unknown Source) 
       oracle.net.ns.NetInputStream.getNextPacket(Unknown Source) 
       oracle.net.ns.NetInputStream.read(Unknown Source) 
       oracle.net.ns.NetInputStream.read(Unknown Source) 
       oracle.net.ns.NetInputStream.read(Unknown Source) 
       oracle.jdbc.driver.T4CMAREngine.unmarshalUB1(T4CMAREngine.java:1104) 
       oracle.jdbc.driver.T4CMAREngine.unmarshalSB1(T4CMAREngine.java:1075) 
       oracle.jdbc.driver.T4C7Ocommoncall.receive(T4C7Ocommoncall.java:106) 
       oracle.jdbc.driver.T4CConnection.logoff(T4CConnection.java:465) 
       oracle.jdbc.driver.PhysicalConnection.close(PhysicalConnection.java:1203) 
       com.mchange.v2.c3p0.impl.NewPooledConnection.close(NewPooledConnection.java:549) 
       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) 

正在使用的C3P0版本是0.9.1.2

+0

幾個問題:你如何測量打開的連接(在數據庫中或只是在Java代碼中打印連接對象)?你如何從代碼獲取連接? getConnection()或getConnection(用戶名,密碼)? 從您的異常追蹤中,看起來連接沒有關閉。你能從數據庫角度找出原因嗎? – prabugp 2014-09-12 14:58:40

+1

主要從服務器上運行tomcat我使用命令測量打開的連接#netstat -an | grep 1521.我們的DBA也僅從數據庫的角度檢查了開放連接,這與我所看到的一致。 – 2014-09-12 15:10:11

+0

關於獲取連接的方法,這是我可以挖掘的,但我的印象是,即使使用getConnection(username,password)方法,它也不會創建多個連接池,因爲我有在context.xml中正好配置了一個用戶名和密碼。 – 2014-09-12 15:12:23

回答

1

對於它的價值,我更新的Tomcat的server.xml並設置自動部署=假,因爲我還沒有遇到任何問題。

我的c3p0連接池設置位於Tomcat的context.xml中,並且在運行時對該文件的任何修改都會導致重新部署應用程序並創建附加連接池。將autoDeploy設置爲false可防止具有不需要的c3p0連接池副作用的Tomcat行爲。

相關問題