windows 2000+tomcat5.5.9+jdk1.5+mysql在应用中出现了socket被占满的问题
如题所述:
服务器是windows 2000
web服务器是tomcat5.5.9安装版(内存设置512mb),使用的是jdk1.5.0_08
数据库使用mysql,使用了c3p0的连接池
有400个访问,有可能会同时访问,在运行了8天后,就出现了以下错误:
=2009-09-14 13:03:31 INFO [TimeActionTrigger] java.net.SocketException: No buffer space available (maximum connections reached?): connect
=2009-09-14 13:03:34 INFO [TimeActionTrigger] java.net.SocketException: No buffer space available (maximum connections reached?): connect
=2009-09-14 13:03:36 INFO [TimeActionTrigger] java.net.SocketException: No buffer space available (maximum connections reached?): connect
=2009-09-14 13:03:39 INFO [TimeActionTrigger] java.net.SocketException: No buffer space available (maximum connections reached?): connect
=2009-09-14 13:03:39 WARN [com.mchange.v2.async.ThreadPoolAsynchronousRunner] com.mchange.v2.async.ThreadPoolAsynchronousRunner$DeadlockDetector@178dff6 -- APPARENT DEADLOCK!!! Creating emergency threads for unassigned pending tasks!
=2009-09-14 13:03:39 WARN [com.mchange.v2.async.ThreadPoolAsynchronousRunner] com.mchange.v2.async.ThreadPoolAsynchronousRunner$DeadlockDetector@178dff6 -- APPARENT DEADLOCK!!! Complete Status: [num_managed_threads: 3, num_active: 3; activeTasks: com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask@b7a8d9 (com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#2), com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask@1ae7b73 (com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#0), com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask@2ac51d (com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#1); pendingTasks: com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask@1f30577, com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask@1ec0319, com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask@1bf8b67, com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask@593bfd, com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask@7198aa]
=2009-09-14 13:03:41 INFO [TimeActionTrigger] java.net.SocketException: No buffer space available (maximum connections reached?): connect
=2009-09-14 13:03:42 WARN [com.mchange.v2.async.ThreadPoolAsynchronousRunner] com.mchange.v2.async.ThreadPoolAsynchronousRunner$DeadlockDetector@1fa3fb4 -- APPARENT DEADLOCK!!! Creating emergency threads for unassigned pending tasks!
=2009-09-14 13:03:42 WARN [com.mchange.v2.async.ThreadPoolAsynchronousRunner] com.mchange.v2.async.ThreadPoolAsynchronousRunner$DeadlockDetector@1fa3fb4 -- APPARENT DEADLOCK!!! Complete Status: [num_managed_threads: 3, num_active: 3; activeTasks: com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask@153d8fd (com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#1), com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask@1cb0324 (com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#0), com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask@13b66bf (com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#2); pendingTasks: com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask@d68d69, com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask@1ddeafa]
=2009-09-14 13:03:51 INFO [TimeActionTrigger] java.net.SocketException: No buffer space available (maximum connections reached?): connect
=2009-09-14 13:03:54 INFO [TimeActionTrigger] java.net.SocketException: No buffer space available (maximum connections reached?): connect
=2009-09-14 13:03:56 INFO [TimeActionTrigger] java.net.SocketException: No buffer space available (maximum connections reached?): connect
=2009-09-14 13:03:57 WARN [com.mchange.v2.resourcepool.BasicResourcePool] com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask@b7a8d9 -- Acquisition Attempt Failed!!! Clearing pending acquires. While trying to acquire a needed new resource, we failed to succeed more than the maximum number of allowed acquisition attempts (30). Last acquisition attempt exception:
java.sql.SQLException: Unable to connect to any hosts due to exception: java.net.SocketException: No buffer space available (maximum connections reached?): connect
** BEGIN NESTED EXCEPTION **
java.net.SocketException
MESSAGE: No buffer space available (maximum connections reached?): connect
STACKTRACE:
java.net.SocketException: No buffer space available (maximum connections reached?): connect
at java.net.PlainSocketImpl.socketConnect(Native Method)
at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:333)
at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:195)
at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:182)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:366)
at java.net.Socket.connect(Socket.java:516)
at java.net.Socket.connect(Socket.java:466)
at java.net.Socket.<init>(Socket.java:366)
at java.net.Socket.<init>(Socket.java:179)
at com.mysql.jdbc.StandardSocketFactory.connect(StandardSocketFactory.java:124)
at com.mysql.jdbc.MysqlIO.<init>(MysqlIO.java:225)
at com.mysql.jdbc.Connection.createNewIO(Connection.java:1783)
at com.mysql.jdbc.Connection.<init>(Connection.java:450)
at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:411)
at com.mchange.v2.c3p0.DriverManagerDataSource.getConnection(DriverManagerDataSource.java:107)
at com.mchange.v2.c3p0.WrapperConnectionPoolDataSource.getPooledConnection(WrapperConnectionPoolDataSource.java:161)
at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool$1PooledConnectionResourcePoolManager.acquireResource(C3P0PooledConnectionPool.java:113)
at com.mchange.v2.resourcepool.BasicResourcePool.doAcquire(BasicResourcePool.java:728)
at com.mchange.v2.resourcepool.BasicResourcePool.access$700(BasicResourcePool.java:32)
at com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask.run(BasicResourcePool.java:1258)
at com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread.run(ThreadPoolAsynchronousRunner.java:368)
** END NESTED EXCEPTION **
从上面能看出是socket被占满及socket连接来不及释放的问题,同时这个问题又了造成不能访问数据库。
我的tomcat配置:
<Connector
port="8080" maxHttpHeaderSize="8192"
maxThreads="8000" minSpareThreads="125" maxSpareThreads="175"
enableLookups="false" redirectPort="8443" acceptCount="100"
connectionTimeout="20000" disableUploadTimeout="true" />
我对windows 的socket连接数没有优化,还是默认的。我想问的是仅仅400个访问就能把socket占满么,会是什么问题能造成这种情况?