Sun Oct 16 10:44:23 CST 2011 WARN: Caught while disconnecting...
EXCEPTION STACK TRACE:
** BEGIN NESTED EXCEPTION ** 
java.net.SocketException
MESSAGE: Socket input is already shutdown
STACKTRACE:
java.net.SocketException: Socket input is already shutdown
at java.net.Socket.shutdownInput(Socket.java:1381)
at com.mysql.jdbc.MysqlIO.quit(MysqlIO.java:1686)
at com.mysql.jdbc.ConnectionImpl.realClose(ConnectionImpl.java:4388)
at com.mysql.jdbc.ConnectionImpl.cleanup(ConnectionImpl.java:1368)
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2654)
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2570)
at com.mysql.jdbc.StatementImpl.executeQuery(StatementImpl.java:1476)
at com.mchange.v2.c3p0.impl.DefaultConnectionTester.activeCheckConnection(DefaultConnectionTester.java:73)
at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool$1PooledConnectionResourcePoolManager.testPooledConnection(C3P0PooledConnectionPool.java:374)
at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool$1PooledConnectionResourcePoolManager.refurbishIdleResource(C3P0PooledConnectionPool.java:310)
at com.mchange.v2.resourcepool.BasicResourcePool$AsyncTestIdleResourceTask.run(BasicResourcePool.java:1999)
at com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread.run(ThreadPoolAsynchronousRunner.java:547)
** END NESTED EXCEPTION **RT,短暂的出现了几次异常,然后服务正常,从日志上看未出现错误,服务仍能正确访问

解决方案 »

  1.   


    com.mysql.jdbc.MysqlIO.quit(MysqlIO.java:1686)在你的quit方法中,Socket input流已经关闭了,你可以先判断是否关闭,再使用你的方法。
      

  2.   

    看上去不像是网络断线了。。像是你的socket取不到数据
    这句at com.mchange.v2.c3p0.impl.DefaultConnectionTester.activeCheckConnection
    看看是不是因为你的c3p0连接池的空闲连接时间超时后自动关闭连接了。。然后引起了socket连接状态或取数据异常。
      

  3.   

    那个是c3p0的定时自动重连以保持连接么,好像是mysql8小时会断开,所以设了这个,但是后来又听说高版本的mysql设了这个也不管用
    迷糊中,不过观察了一天,服务没有异常
      

  4.   

    Mysql服务器默认的“wait_timeout”是8小时,也就是说一个connection空闲超过8个小时,Mysql将自动断开该 connection。这就是问题的所在,在C3P0 pools中的connections如果空闲超过8小时,Mysql将其断开,而C3P0并不知道该connection已经失效,如果这时有 Client请求connection,C3P0将该失效的Connection提供给Client,将会造成上面的异常。解决的方法有3种:1.增加wait_timeout的时间。 
    2.减少Connection pools中connection的lifetime。 
    3.测试Connection pools中connection的有效性。 DBCP增加以下配置信息:1.//set to 'SELECT 1' 
    2.validationQuery = "SELECT 1" 
    3.//set to 'true' 
    4.testWhileIdle = "true" 
    5.//some positive integer 
    6.timeBetweenEvictionRunsMillis = 3600000 
    7.//set to something smaller than 'wait_timeout' 
    8.minEvictableIdleTimeMillis = 18000000 
    9.//if you don't mind a hit for every getConnection(), set to "true" 
    10.testOnBorrow = "true" C3P0增加以下配置信息:
    1.//获取connnection时测试是否有效 
    2.testConnectionOnCheckin = true 
    3.//自动测试的table名称4.automaticTestTable=C3P0TestTable5.//set to something much less than wait_timeout, prevents connections from going stale 
    6.idleConnectionTestPeriod = 18000 
    7.//set to something slightly less than wait_timeout, preventing 'stale' connections from being handed out 
    8.maxIdleTime = 25000 
    9.//if you can take the performance 'hit', set to "true" 
    10.testConnectionOnCheckout = true