Tomcat使用c3p0数据源,超出了maxPoolSize

时间:2014-09-12 14:54:21

标签: java tomcat datasource connection-pooling c3p0

我已将Tomcat配置为使用ComboPooledDataSource,方法是在我的context.xml中添加以下内容。

<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: com.mchange.v2.c3p0.impl.NewPooledConnection@3ca5d95d
java.sql.SQLException: Some resources failed to close properly while closing com.mchange.v2.c3p0.impl.NewPooledConnection@3ca5d95d
        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.mchange.v2.async.ThreadPoolAsynchronousRunner$DeadlockDetector@1c203f2b -- APPARENT DEADLOCK!!! Creating emergency threads for unassigned pending tasks!
2014-09-11 11:36:45,323  WARN [Timer-0] ThreadPoolAsynchronousRunner:624 -  - com.mchange.v2.async.ThreadPoolAsynchronousRunner$DeadlockDetector@1c203f2b -- APPARENT DEADLOCK!!! Complete Status:
        Managed Threads: 3
        Active Threads: 3
        Active Tasks:
                com.mchange.v2.resourcepool.BasicResourcePool$1DestroyResourceTask@4a50503d (com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#2)
                com.mchange.v2.resourcepool.BasicResourcePool$1DestroyResourceTask@5ec3fae8 (com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#0)
                com.mchange.v2.resourcepool.BasicResourcePool$1DestroyResourceTask@148dc5f3 (com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#1)
        Pending Tasks:
                com.mchange.v2.resourcepool.BasicResourcePool$1DestroyResourceTask@67bedf0f
                com.mchange.v2.resourcepool.BasicResourcePool$1DestroyResourceTask@242686ff
                com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask@5d68e1e3
                com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask@10c62dfe
                com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask@42f5874c
                com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask@585b0ec
                com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask@c2258c9
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

1 个答案:

答案 0 :(得分:1)

为了它的价值,我更新了Tomcat的server.xml并设置了autoDeploy = false,之后我没有遇到任何问题。

我的c3p0连接池设置位于Tomcat的context.xml中,并且在运行时对此文件的任何修改都将导致重新部署应用程序并创建其他连接池。将autoDeploy设置为false可防止此Tomcat行为产生不必要的c3p0连接池副作用。