美文网首页
myBatis连接MySQL:No operations all

myBatis连接MySQL:No operations all

作者: 流浪小行 | 来源:发表于2016-01-25 10:37 被阅读2971次

    异常信息:

    Caused by: com.mysql.jdbc.exceptions.MySQLNonTransientConnectionException: No operations allowed after connection closed.Connection was implicitly closed due to underlying exception/error:

    ** BEGIN NESTED EXCEPTION **

    com.mysql.jdbc.CommunicationsException

    MESSAGE: Communications link failure due to underlying exception:

    ** BEGIN NESTED EXCEPTION **

    java.net.SocketException

    MESSAGE: Broken pipe

    STACKTRACE:

    java.net.SocketException: Broken pipe

    at java.net.SocketOutputStream.socketWrite0(Native Method)

    ......

    ** END NESTED EXCEPTION **

    原因分析:

    查看了Mysql的文档,以及Connector/J的文档以及在线说明发现,出现这种异常的原因是:

    Mysql服务器默认的“wait_timeout”是8小时,也就是说一个connection空闲超过8个小时,Mysql将自动断开该connection。这就是问题的所在,在C3P0 pools中的connections如果空闲超过8小时,Mysql将其断开,而C3P0并不知道该connection已经失效,如果这时有Client请求connection,C3P0将该失效的Connection提供给Client,将会造成上面的异常。

    DBCP解决方案:

    加上如下配置:

    //SQL查询,用来验证从连接池取出的连接,在将连接返回给调用者之前.如果指定,则查询必须是一个SQL SELECT并且必须返回至少一行记录

    validationQuery = "select 1"

    //指明连接是否被空闲连接回收器(如果有)进行检验.如果检测失败,则连接将被从池中去除.

    testWhileIdle = "true"

    //在空闲连接回收器线程运行期间休眠的时间值,以毫秒为单位.如果设置为非正数,则不运行空闲连接回收器线程

    timeBetweenEvictionRunsMillis = 3600000

    //1000 * 60 * 30  连接在池中保持空闲而不被空闲连接回收器线程,(如果有)回收的最小时间值,单位毫秒

    minEvictableIdleTimeMillis = 18000000

    //指明是否在从池中取出连接前进行检验,如果检验失败,则从池中去除连接并尝试取出另一个.

    testOnBorrow = "true"

    DBCP参数参考:

    http://commons.apache.org/dbcp/configuration.html

    相关文章

      网友评论

          本文标题:myBatis连接MySQL:No operations all

          本文链接:https://www.haomeiwen.com/subject/ynarkttx.html