`
MauerSu
  • 浏览: 514563 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

Mysql经mysql连接的空闲时间超过8小时后 MySQL自动断开该连接解决方案

 
阅读更多
源:http://www.jb51.net/article/32284.htm
http://www.jb51.net/article/64935.htm
评:
MySQL 的默认设置下,当一个连接的空闲时间超过8小时后,MySQL 就会断开该连接,而 c3p0 连接池则以为该被断开的连接依然有效。

假设你的数据库是mysql,如果数据源配置不当,将可能发生经典的“8小时问题”。原因是mysql在默认情况下,如果发现一个连接的空闲时间超过8小时,将会在数据库端自动关闭这个连接。而数据源并不知道这个连接已经关闭了,当它将这个无用的连接返回给某个dao时,dao就会报无法获取connection异常。

    如果采用dbcp的默认配置,由于testOnBorrow属性的默认值是true,数据源在将连接交给dao前,会事先检测这个连接是否是好的,如果连接有问题(在数据库端被关闭),则会取一个其他的连接给dao。所以并不会有“8小时问题”。如果每次将连接交给dao时都检测连接的有效性,在高并发的应用中将会带来性能的问题,因为它会需要更多的数据库访问请求。

    一种推荐的高效的方式是:将testOnBorrow设置为false,而将“testWhileIdle”设置为true,再设置好testBetweenEvictionRunsMillis值(小于8小时)。那些被mysql关闭的连接就可以别清除出去,避免“8小时问题”。

    当然,mysql本身也能调整interactive-timeout(以秒为单位)配置参数,更改空闲连接的过期时间。所以,在设置timeBetweenEvictionRunsmMillis值时,必须首先获知mysql的空闲连接的最大过期时间。

    c3p0对于有效连接的检测,请参照dbcp配置方式。

----
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>
分享到:
评论

相关推荐

    mysql连接的空闲时间超过8小时后 MySQL自动断开该连接解决方案

    解决这个问题的办法有三种: 1. 增加 MySQL 的 wait_timeout 属性的值。 修改 /etc/mysql/my.cnf文件,在 [mysqld] 节中设置: # Set a connection to wait 8hours in idle status. wait_timeout =86400 相关参数,...

    MySQL+Hibernate下连接空闲8小时自动断开问题解决方案.pdf

    解决 MySQL+Hibernate 连接空闲8小时自动断开问题 概述: 在使用 MySQL 和 Hibernate 进行数据库持久层开发时,可能会遇到连接空闲8小时自动断开的问题。本文将讨论该问题的解决方案,并对相关的知识点进行详细...

    MySQL+Hibernate下连接空闲8小时自动断开问题解决方案.docx

    MySQL+Hibernate 连接空闲8小时自动断开问题解决方案 知识点1: Hibernate 的连接池机制 在 Hibernate 中,默认情况下 使用的是 DriverManagerConnectionProvider,这是一个简单的连接池机制。它将打开的连接缓存在...

    mysql 8小时空闲后连接超时的问题

    在描述中提到的解决方案是通过调整MySQL的配置来解决8小时空闲后连接超时的问题。有两种方法: 1. 修改启动参数: 在启动MySQL服务时,可以添加`--interactive_timeout=288000`参数,将交互式连接的超时时间设置为...

    使用数据库连接池proxool配置mysql数据库

    MySQL默认的会话超时时间是8小时,超过这个时间未使用的连接会被自动断开。对于长时间运行的应用,这可能导致连接失效,进而影响应用程序的稳定性。通过使用Proxool,我们可以设置连接的生命周期,确保即使超过了...

    javaee mysql空闲关闭

    然而,为了优化资源使用,MySQL配置了一个参数`wait_timeout`,这个参数定义了连接在空闲多长时间后会被自动关闭。当JavaEE应用中的数据库连接在超过这个设定的时间没有执行任何操作,MySQL服务器会断开这个连接,这...

    mysql 异常com.mysql.jdbc.CommunicationsException

    异常发生的原因在于MySQL服务器默认设置了一个超时时间(`wait_timeout`),如果一个连接长时间未被使用,则MySQL会自动断开这个连接。在这个案例中,C3P0连接池中的某些连接由于长时间空闲而被MySQL服务器断开,...

    MySQL数据库服务器下C3P0连接池的配置.pdf

    查阅相关文档后发现,造成报错的原因是:MySQL的默认设置为当一个连接的空闲时间超过8小时后,MySQL就会断开该连接,而C3P0连接池则以为被断开的连接依然有效。在这种情况下,如果客户端代码向C3P0连接池请求连接的...

    hibernate+proxool解决mysql8小时问题(附带jar包)

    MySQL数据库在长时间无操作的情况下,为了节省资源,会自动关闭闲置的连接,这通常被称为“8小时问题”。为了解决这个问题,开发者通常需要采取特定的策略,比如使用连接池。在本案例中,我们看到一种解决方案,即...

    Spring Boot如何解决Mysql断连问题

    这个问题是由于 Mysql 的.wait_timeout 参数所致,默认情况下,wait_timeout 的值是 8 小时,如果连接空闲时间超过 8 小时,Mysql 将自动关闭这个连接。 导致断连的原因是 Mysql 的默认行为。Mysql 在发现一个连接...

    mysql连接池java源码

    阅读并理解这个纯Java实现的连接池源码,可以帮助我们深入理解数据库连接池的工作原理,为今后优化和定制自己的连接池解决方案打下坚实的基础。 总的来说,这个项目提供了一个学习和研究数据库连接池实现的绝佳...

    mysql数据连接池

    MySQL 数据连接池是一种数据库管理技术,它在应用服务器和数据库之间起到了中介的作用,优化了数据库的连接使用,提高了系统的性能和资源利用率。在Java、Python等编程语言中,都有相应的库或框架支持数据连接池的...

    基于 MySQL 协议,Swoole 开发的MySQL数据库连接池.zip

    同时,还可以通过设置连接池的参数来控制连接池中的初始连接数、连接的上下限数以及每个连接的最大使用次数、最大空闲时间等等。 也可以通过其自身的管理机制来监视数据库连接的数量、使用情况等。超出最大连接数会...

    MySQL wait_timeout连接超时

    `wait_timeout`是MySQL服务器中的一个系统变量,它定义了在交互式会话(即没有显式启动事务的会话)中,如果客户端在指定时间内没有发送任何新的命令,服务器将关闭该连接的等待时间。默认值通常为8小时(8*60*60秒...

    MySQL数据库连接超时(Wait_timeout)问题总结.pdf

    当应用程序遇到这种问题时,一种常见的解决方案是在数据库连接字符串中添加"autoReconnect=true"选项,试图在断开连接后自动重新连接。然而,对于MySQL 4.0之前的版本,这种方法可能有效,但在较新的MySQL版本中,...

    Tomcat6连接池配置详解(自动重连)

    这是实现自动重连的关键配置之一,一旦连接断开,连接池会尝试通过执行该查询来重新建立连接。 如果使用其他类型的数据库,只需修改`url`和`driverClassName`即可。 #### 三、配置上下文参数 **2. 在`conf/...

    Mysql经典的“8小时问题”

    MySQL在空闲连接达到一定时间(默认8小时,即`wait_timeout`参数设定的时间)后会自动断开这些连接,以节省系统资源。然而,一些连接池如c3p0可能没有及时检测到这种变化,仍尝试使用已被MySQL断开的连接,导致应用...

    mysql的连接数据问题

    2. 快速断开无用连接:避免长时间空闲连接占用资源,设置合理的`interactive_timeout`和`wait_timeout`。 3. 调整`max_connect_errors`:限制错误连接尝试次数,防止恶意攻击。 4. 监控连接状态:定期检查`SHOW ...

    (源码)基于C++和MySQL API的数据库连接池系统.zip

    该系统旨在解决在高并发环境下频繁进行数据库连接和断开操作所带来的性能瓶颈问题。通过引入数据库连接池,系统能够有效提高数据库访问效率,减少资源消耗,从而提升整体开发效率。 ## 项目的主要特性和功能 1. ...

Global site tag (gtag.js) - Google Analytics