zoukankan      html  css  js  c++  java
  • MySQL5.6数据库8小时内无请求自动断开连接

    问题:

    最近的项目中,发现Mysql数据库在8个小时内,没有请求时,会自动断开连接,这是MySQL服务器的问题。
    The last packet successfully received from the server was 1,836,166 milliseconds ago.  The last packet sent successfully to the server was 29,134 milliseconds ago.

    原因:


    MySQL服务器默认的“wait_timeout”是28800秒即8小时,意味着如果一个连接的空闲时间超过8个小时,MySQL将自动断开该连接,

    而连接池却认为该连接还是有效的(因为并未校验连接的有效性),当应用申请使用该连接时,就会导致上面的报错。


    解决方案:
    数据库连接如果空闲时,进行有效性验证。(如果使用连接池,配置几个属性即可)

    <!-- 解决长时间不连接,连接失败问题 -->
        <property name="testOnBorrow" value="true"></property>
        <property name="testOnReturn" value="true"></property>
        <property name="testWhileIdle" value="true"></property>
        <property name="validationQuery" value="SELECT 1 FROM DUAL"></property>

    Oracle数据库:SELECT 1 FROM DUAL

    SqlServer数据库:SELECT 1

    下面以DBCP连接池举例——

    (其他连接池应该也都有以下属性,可以查看文档或源码),下图是我的项目的连接池的源码举例:



    在DBCP连接池中有以下几个属性:


    testOnBorrow、testOnReturn、testWhileIdle,他们的意思是当是取得连接、返回连接或连接空闲时是否进行有效性验证(即是否还和数据库连通的),默认都为false。所以当数据库连接因为某种原因断掉后,再从连接池中取得的连接,实际上可能是无效的连接了,所以,为了确保取得的连接是有效的,可以把把这些属性设为true。当进行校验时,需要另一个参数:validationQuery,对oracle来说,可以是:SELECT COUNT(*) FROM DUAL,实际上就是个简单的SQL语句,验证时,就是把这个SQL语句在数据库上跑一下而已,如果连接正常的,当然就有结果返回了。 

    然后minEvictableIdleTimeMillis配合timeBetweenEvictionRunsMillis,每过timeBetweenEvictionRunsMillis秒对连接池进行一次检测,将对象闲置时间超过minEvictableIdleTimeMillis秒的对象进行销毁,创建新的对象来取代。这样就能保证时刻都有正常的连接池对象存在。

    还有其他的一些参数,可以参考源代码。 
    部分参数简要说明: 
    removeAbandoned :是否自动回收超时连接 
    removeAbandonedTimeout:超时时间(以秒数为单位) 
    removeAbandoned=true那么在getNumActive()快要到getMaxActive()的时候,系统会进行无效的Connection的回收,回收的Connection为removeAbandonedTimeout(默认300秒)中设置的秒数后没有使用的Connection 
    logAbandoned:logAbandoned=true的话,将会在回收事件后,在log中打印出回收Connection的错误信息,包括在哪个地方用了Connection却忘记关闭了,在调试的时候很有用。 
    maxWait:超时等待时间以毫秒为单位 
    maxIdle:最大空闲连接 
    minIdle:最小空闲连接 
    maxActive:最大连接数 
    testOnBorrow、testOnReturn、testWhileIdle、validationQuery:上面有介绍 
    另外很重要的一点是每次连接使用完了不要忘了调用connection.close()使连接返回到连接池

  • 相关阅读:
    1001. 害死人不偿命的(3n+1)猜想 (15)
    c语言学习习题
    设计模式随笔(四):单例模式
    设计模式随笔(三):建造者模式
    设计模式随笔(二):抽象工厂模式
    设计模式随笔(一):介绍java中常用的设计模式
    idea导入spring5.x源码编译
    使用idea从git上项目后jar包无法加载
    SFTP文件上传下载以及如何处理异常,页面展现
    Java代理模式
  • 原文地址:https://www.cnblogs.com/Donnnnnn/p/9321900.html
Copyright © 2011-2022 走看看