zoukankan      html  css  js  c++  java
  • mysql连接的空闲时间超过8小时后 MySQL自动断开该连接解决方案

    在连接字符串中  添加设置节点 ConnectionLifeTime(计量单位为 秒)。超过设定的连接会话 会被杀死!

    Connection Lifetime, ConnectionLifeTime

    0

    When a connection is returned to the pool, its creation time is compared with the current time, and the connection is destroyed if that time span (in seconds) exceeds the value specified by Connection Lifetime. This is useful in clustered configurations to force load balancing between a running server and a server just brought online. A value of zero (0) causes pooled connections to have the maximum connection timeout.

        public bool ConnectionLifetimeExpired()
        {
          TimeSpan ts = DateTime.Now.Subtract(creationTime);
          if (Settings.ConnectionLifeTime != 0 &&
            ts.TotalSeconds > Settings.ConnectionLifeTime)
            return true;
          return false;
        }

    MySQL 的默认设置下,当一个连接的空闲时间超过8小时后,MySQL 就会断开该连接,而 c3p0 连接池则以为该被断开的连接依然有效。在这种情况下,如果客户端代码向 c3p0 连接池请求连接的话,连接池就会把已经失效的连接返回给客户端,客户端在使用该失效连接的时候即抛出异常

    解决这个问题的办法有三种:

    1. 增加 MySQL 的 wait_timeout 属性的值。

    修改 /etc/mysql/my.cnf文件,在 [mysqld] 节中设置:

    # Set a connection to wait 8hours in idle status.
    wait_timeout =86400
    相关参数,红色部分
    mysql> show variables like '%timeout%';
    +--------------------------+-------+
    | Variable_name | Value |
    +--------------------------+-------+
    | connect_timeout | 5 |
    | delayed_insert_timeout | 300 |
    | innodb_lock_wait_timeout | 50 |
    | interactive_timeout | 28800 |
    | net_read_timeout | 30 |
    | net_write_timeout | 60 |
    | slave_net_timeout | 3600 |
    | wait_timeout | 28800 |
    +--------------------------+-------+
    同一时间,这两个参数只有一个起作用。到底是哪个参数起作用,和用户连接时指定的连接参数相关,缺省情况下是使用wait_timeout。我建议是将这两个参数都修改,以免引起不必要的麻烦。

    这两个参数的默认值是8小时(60*60*8=28800)。我测试过将这两个参数改为0,结果出人意料,系统自动将这个值设置为。换句话说,不能将该值设置为永久。
    将这2个参数设置为24小时(60*60*24=604800)即可。
    set interactive_timeout=604800;
    set wait_timeout=604800;

    2. 减少连接池内连接的生存周期,使之小于上一项中所设置的 wait_timeout 的值。
    修改 c3p0 的配置文件,设置:

    # How long to keep unused connections around(in seconds)
    # Note: MySQL times out idle connections after 8hours(28,800seconds)
    # so ensure this value is below MySQL idle timeout
    cpool.maxIdleTime=25200
    在 Spring 的配置文件中:

    复制代码 代码如下:

    <bean id="dataSource"
    class="com.mchange.v2.c3p0.ComboPooledDataSource">
    <property name="maxIdleTime"value="${cpool.maxIdleTime}"/>
    <!--other properties -->
    </bean>



    3. 定期使用连接池内的连接,使得它们不会因为闲置超时而被 MySQL 断开。
    修改 c3p0 的配置文件,设置:

    # Prevent MySQL raise exception after a long idle timecpool.preferredTestQuery='SELECT 1'cpool.idleConnectionTestPeriod=18000cpool.testConnectionOnCheckout=true
    修改 Spring 的配置文件:

    复制代码 代码如下:

    <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
    <property name="preferredTestQuery" value="${cpool.preferredTestQuery}"/>
    <property name="idleConnectionTestPeriod" value="${cpool.idleConnectionTestPeriod}"/>
    <property name="testConnectionOnCheckout" value="${cpool.testConnectionOnCheckout}"/>
    <!--other properties --></bean> 
     
  • 相关阅读:
    文件中的类都不能进行设计,因此未能为该文件显示设计器。设计器检查出文件中有以下类: FormMain --- 未能加载基类“WinForm.Win.FormsBase.FormMainBase”。请确保已引用该程序集并已生成所有项目
    Xcopy命令参数使用介绍
    c#生成方案里预生成拷贝文件
    visual studio 2010 出现问题,不能设置断点调试了,一运行就未响应,然后程序退出
    开启Visual Studio 2013时,出现Microsoft.VisualStudio.Web.PasteJson.JsonPackage无法载入的可能解決方案
    Java开发知识之XML文档使用,解析
    JAVA开发知识之Java的线程
    git版本控制工具的使用
    Java开发知识之Java的正则表达式
    PC逆向之代码还原技术,第一讲基本数据类型在内存中的表现形式.浮点,指针寻址公式
  • 原文地址:https://www.cnblogs.com/micro-chen/p/6015052.html
Copyright © 2011-2022 走看看