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

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

时间:2023-04-20 11:31:36浏览次数:41  
标签:Mysql mysql c3p0 timeout MySQL 连接 wait


评:
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,mysql,c3p0,timeout,MySQL,连接,wait
From: https://blog.51cto.com/u_16080829/6209286

相关文章

  • git连接仓库
    要连接到远程Git存储库,请按照以下步骤操作:1.在本地计算机上打开终端或命令提示符。2.转到您要将存储库克隆到的目录。3.使用以下命令克隆存储库:gitclone<remoterepositoryURL>例如:gitclonehttps://github.com/username/repository.git4.配置Git以使用您的用户名和......
  • Oracle MySQL Server 拒绝服务漏洞(CVE-2023-21912) 修复
    CVE编号公告标题和摘要最高严重等级受影响的软件CVE-2023-21912OracleMySQLServer拒绝服务漏洞未经身份验证的远程攻击者可通过MySQL协议网络访问MySQLServer,成功利用此漏洞可导致目标MySQLServer挂起或频繁重复崩溃,造成拒绝服务攻击重要MySQLServer<=5.7.41......
  • 提高mysql千万级大数据SQL查询优化30条经验(Mysql索引优化注意)
    对查询进行优化,应尽量避免全表扫描,首先应考虑在where及orderby涉及的列上建立索引。应尽量避免在where子句中对字段进行null值判断,否则将导致引擎放弃使用索引而进行全表扫描,如:selectidfromtwherenumisnull可以在num上设置默认值0,确保表中num列没有null值,然......
  • mysql,redis,mongodb常用命令
    MySQL常用命令:1.mysql-uusername-p:以指定用户身份登录MySQL数据库。2.showdatabases:列出所有数据库。3.usedatabase_name:选择指定的数据库。4.showtables:列出当前数据库中的所有表。5.describetable_name:显示指定表的结构。6.select*fromtable_name:查询指......
  • 超实用的 MySQL 语句写法
    1.插入或替换有时候,在向数据库中插入数据时,你可能会想要更新一行数据,而不是添加一行新数据。这时候,可以使用INSERTORREPLACE语句来实现这个目的。示例:INSERTORREPLACEINTOtable_name(id,name,age)VALUES(1,'Jack',28);在这个例子中,如果表中已经存在id......
  • TCP长连接的连接池、容量控制与心跳保活
    一、长连接与短连接TCP本身并没有长短连接的区别,长短与否,完全取决于我们怎么用它。短连接:每次通信时,创建Socket;一次通信结束,调用socket.close()。这就是一般意义上的短连接,短连接的好处是管理起来比较简单,存在的连接都是可用的连接,不需要额外的控制手段。长连接:每次通信完毕......
  • 基于SSM和MySQL实现的疫情数据统计分析系统
    基于SSM和MySQL实现的疫情数据统计分析系统访问【WRITE-BUG数字空间】_[内附完整源码和文档]1.项目简介疫情数据统计分析系统是一个基于SSM框架的网页端系统,项目中实现的功能如下:用户访问网站可以浏览全国疫情的图表信息,管理员登录后台管理系统,可以进行数据录入、数据查询、图表展......
  • MySQL中binlog备份脚本分享
    关于MySQL的二进制日志(binlog),我们都知道二进制日志(binlog)非常重要,尤其当你需要pointtopoint灾难恢复的时侯,所以我们要对其进行备份。关于二进制日志(binlog)的备份,可以基于flushlogs方式先切换binlog,然后拷贝&压缩到到远程服务器或本地服务器的其他存储上,例如挂载的NAS存储,也可......
  • go项目中数据库连接,以及redis连接
     文件:common/mysql.go数据库连接文件packagecommonimport("gorm.io/driver/mysql""gorm.io/gorm""gorm.io/gorm/schema""log")varDB*gorm.DB//全局定义DBvardbErrerror//定义数据库错误funcinit(){dsn:=......
  • 程序员必备上传服务器Xftp及连接服务器工具Xshell
    1.下面截图为破解工具,点击执行就可以用了 ......