解决JDBC连接Mysql长时间无动作连接失效的问题

错误场景介绍

做的有一个项目使用JDBC手动创建Connection实现了一个简单的自定义数据库连接池,用来支持Canal解析数据库Binlog指定业务库的插入修改SQL来进行数据库分表备份(按照月份)操作.

但是发现当一个一段时间(较长)没有进行数据库操作时,连接都失效了,导致SQL执行失败失效提示为No operations allowed after connection closed

查明原因

经过搜索发现这个问题是由于Mysql默认一个已创建的长连接28800秒(八小时)内没有任何动作则会断开连接,该值对应参数为wait_timeout.当超时时间内有执行动作则会重新计时

查验

查询Mysql超时连接时长命令show global variables like'wait_timeout'查看当前设置的超时断开连接时长.

将其改为10,本地服务运行功能发现重现了No operations allowed after connection closed错误,即确实是连接超时失效

解决方法

1. 修改Mysql配置

该方法不能根治这个问题,因为不能确认服务空闲时长而精确设置timeout并且还会造成多余连接长时间未断开而影响性能,所以不建议使用.建议在代码层面进行解决

通过set global wait_timeout=time(秒)来修改最长连接等待超时时间,但是这样设置当Mysql重启失效

可以通过修改my.ini文件永久改动超时时间,如下配置

interactive_timeout=28800000
wait_timeout=28800000

2. 连接丢弃重新创建连接

使用conn.isValid(int timeout)(秒)判断是否失效返回true表示连接有效,返回false表示连接失效.当失效时则重新获取一个数据库连接即可,之前的对象由于引用丢失会被回收掉.

3. 增加自动重连选项

在URL最后添加autoReconnect=true参数,jdbc:mysql://hostaddress:3306/xhb?autoReconnect=true.我这里对这个没有效果,可能是对框架连接池有用.

4. 定时执行一个动作进行超时时间刷新

比如默认时间是八小时,则每七小时对连接执行一次select 1语句来刷新该连接在数据库的超时等待时长

也可以1 2 4一起使用,来防止突然一个流量静默期间后突发流量高峰而导致获取连接不及时

补充:连接总是被mysql回收_一般连接池是怎么处理mysql自动回收长时间

若干套 MySQL 环境,只有一套:

行为异常,e5a48de588b63231313335323631343130323136353331333436316239怀疑触发 bug

性能异常,比其他环境都要低

在这种场景下,我们一般的做法是首先控制变量,查看软硬件配置,以及 MySQL 的参数配置。关于 MySQL 的参数配置对比,如果我们人工对比的话只会关注某些重点参数,而缺少了整体细节上的的对比。在这里我们推荐给大家 Percona Toolkit 中的一个工具 pt-config-diff

更准确的复制延时 pt-heartbeat在 MySQL 中,复制延迟可以理解为由两部分组成:1. 主库已经生成了 BINLOG,但是还没有发送给从库 -- 我们在这里称之为:日志延迟2. 从库已经接收到了 BINLOG,但是还没有应用完成 -- 我们在这里称之为:应用延迟MySQL 原生的查看复制延迟的手段为:show slave status\G中的Seconds_Behind_Master。这种观测手法只能观测出应用延迟。在异步复制或降级的半同步复制下,误差较大,无法准确的反映出整体复制延时。

1. 在 Master 上循环插入:insert into database.heartbeat (master_now) values(NOW())

2. database.heartbeat 的变更会跟随主从复制流向从库

3. 系统当前时间 - 从库表中的时间 = 从库实际的复制延时

更简单的参数配置建议 pt-variable-advisortoolkit 中包含了一个简单的 MySQL 参数优化器,可以对参数配置做简单的优化建议。

更准确的复制延时 pt-heartbeat在 MySQL 中,复制延迟可以理解为由两部分组成:1. 主库已经生成了 BINLOG,但是还没有发送给从库 -- 我们在这里称之为:日志延迟2. 从库已经接收到了 BINLOG,但是还没有应用完成 -- 我们在这里称之为:应用延迟MySQL 原生的查看复制延迟的手段为:show slave status\G中的Seconds_Behind_Master。这种观测手法只能观测出应用延迟。在异步复制或降级的半同步复制下,误差较大,无法准确的反映出整体复制延时。

更易用的调试工具 pt-pmp在某些情况下,我们肯定会遇到某些故障无法从日志,以及状态命令中找到原因,需要深入到程序逻辑级别。又或者我们需要立即通过非常规手段恢复故障数据库,但是又想保留足够多的故障信息。来避免我们事后复现问题的头疼。pt-pmp 便是在这种场景下帮助我们的工具。它会使用 gdb 来打印 mysqld 的堆栈信息,并把调用链相同的线程堆栈合并。堆栈合并的功能对于 MySQL 这种多线程的应用非常有帮助,会节省我们大量的时间。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。如有错误或未考虑完全的地方,望不吝赐教。

(0)

相关推荐

  • MySql状态查看方法 MySql如何查看连接数和状态?

    怎么进入mysql命令行呢? mysql的安装目录下面有个bin目录,先用命令行进入该目录,然后用 mysql -uroot -p123456 来登录(注意:用户名和密码不用包含"") 命令: show processlist; 如果是root帐号,你能看到所有用户的当前连接.如果是其它普通帐号,只能看到自己占用的连接. show processlist;只列出前100条,如果想全列出请使用show full processlist; mysql> show processlis

  • mysql最大连接数设置技巧总结

    方法一:命令行修改 我们只需要打开mysql的控制台,输入"set GLOBAL max_connections=1000;"语句,就可直接设置最大连接数,如下图所示: 注:这种方法标不治本,只能暂时的修改最大连接数,一点重启mysql,最大连接数又会变回原先设置的值. 方法二:通过mysql配置文件来修改最大连接数 1.电脑上打开mysql安装目录,找到my.ini文件,如下图所示: 2.用记事本的方式打开my.ini文件,查找并修改"max_connections&quo

  • Java 如何使用JDBC连接数据库

    一.使用JDBC连接数据库 1.使用JDBC-ODBC桥驱动程序连接数据库 基本步骤: (1)加载并注册数据库驱动 (2)通过DriverManager获取数据库连接 (3)通过Connection对象获取Statement对象 (4)使用Statement接口执行SQL语句 (5)操作ResultSet结果集 (6)关闭连接,释放资源 2.下面进行代码演示 1.注册数据库驱动程序的语法格式如下: DriverManager.registerDriver(Driver driver) 或者 Cl

  • Java连接MYSQL数据库的实现步骤

    此文章主要向大家描述的是Java连接MYSQL 数据库(以MySQL为例)的实际操作步骤,我们是以相关实例的方式来引出Java连接MYSQL 数据库的实际操作流程,以下就是文章的主要内容描述. 当然,首先要安装有JDK(一般是JDK1.5.X).然后安装MySQL,这些都比较简单,具体过程就不说了.配置好这两个环境后,下载JDBC驱动mysql-connector-java-5.0.5.zip(这个是最新版的).然后将其解压缩到任一目录.我是解压到D盘,然后将其目录下的mysql-connect

  • mysql查询慢的原因和解决方案

    查询速度慢的原因很多,常见如下几种: 1.没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设计的缺陷) 2.I/O吞吐量小,形成了瓶颈效应. 3.没有创建计算列导致查询不优化. 4.内存不足 5.网络速度慢 6.查询出的数据量过大(可以采用多次查询,其他的方法降低数据量) 7.锁或者死锁(这也是查询慢最常见的问题,是程序设计的缺陷) 8.sp_lock,sp_who,活动的用户查看,原因是读写竞争资源. 9.返回了不必要的行和列 10.查询语句不好,没有优化 可以通过如下方法来优化查询

  • Mysql错误:Too many connections的解决方法

    MySQL数据库 Too many connections 出现这种错误明显就是 mysql_connect 之后忘记 mysql_close: 当大量的connect之后,就会出现Too many connections的错误,mysql默认的连接为100个,而什么情况下会出现这种错误呢? 正常的mysql_connect 之后调用 mysql_close()关闭连接 但在连接错误时,会者mysql_real_query()出现错误退出时,可能忘记mysql_close(); 所以在程序ret

  • 解决JDBC连接Mysql长时间无动作连接失效的问题

    错误场景介绍 做的有一个项目使用JDBC手动创建Connection实现了一个简单的自定义数据库连接池,用来支持Canal解析数据库Binlog指定业务库的插入修改SQL来进行数据库分表备份(按照月份)操作. 但是发现当一个一段时间(较长)没有进行数据库操作时,连接都失效了,导致SQL执行失败失效提示为No operations allowed after connection closed 查明原因 经过搜索发现这个问题是由于Mysql默认一个已创建的长连接28800秒(八小时)内没有任何动作

  • Java后端长时间无操作自动退出的实现方式

    目录 Java后端长时间无操作自动退出 使用session(最优) 使用拦截器 对于登陆长时间未操作超时退出问题 首先设置一个拦截器 然后进行配置文件 页面以及调用 页面 Java后端长时间无操作自动退出 使用session(最优) 设置session的过期时间,长时间(例如30分钟)无请求就会自动清除,达到长时间无操作自动退出的目的 server: port: 9201 session: timeout: 1800 使用拦截器 实现思路:每次请求后台时,在拦截器中刷新session,设置ses

  • java连接mysql数据库及测试是否连接成功的方法

    本文实例讲述了java连接mysql数据库及测试是否连接成功的方法.分享给大家供大家参考,具体如下: package com.test.tool; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement

  • javascript连接mysql与php通过odbc连接任意数据库的实例

    脑洞大开用javascript链接mysql,2个小时总算实现了,用到了odbc,后面又想到用php链接odbc链接数据库,也实现了,就把案例放一下. 注意事项: 1.javascript连接mysql使用的是"new ActiveXObject"这个对象,这个对象只有IE浏览器支持,所以只能在IE浏览器下实现连接mysql. 2.javascript也是通过odbc连接mysql,和php不同的是,其中一个参数,图片中,红色的是php的连接数据源名,蓝色的是javascript连接数

  • JDBC连接mysql乱码异常问题处理总结

    前段时间学习JDBC,要连接mysql获取数据.按照老师的样例数据,要存一些名字之类的信息,用的都是英文名,我当时就不太想用英文,就把我室友的名字存了进去,嘿嘿,结果,出问题了. 连接数据库语句: static final String DB_URL = "jdbc:mysql://localhost/filemanagement"; 查询语句: private static final String theUserQuery = "SELECT name, password

  • C/C++ 连接MySql数据库的方法

    一.VS2008工程设置工作 首先,建立一个windows应用程序的工程,将C/C++->预处理器->预处理器定义下的_WINDOWS改为_CONSOLE, 将连接器->系统->子系统 选择为控制台. 由于我们要使用Mysql的API,并且我们机子上肯定安装了Mysql数据库,所以我们要将工程的头文件路径指向Mysql安装目录的同文件mysql.h所在的位置,将连接库路径指向libmysql.lib所在的路径, 在我的机子上,Mysql 的安装路径为:C:\Program File

  • python3连接MySQL数据库实例详解

    本文实例为大家分享了python3连接MySQL数据库的具体代码,供大家参考,具体内容如下 #python3连接MySQL实例 import pymysql """导入连接MySQL需要的包,没有安装pymysql需要先安装 使用命令行切换到python的安装路径下的scripts子目录下安装(pip install pymysql) """ #连接MySQL数据库 db = pymysql.connect("localhost&quo

  • 教你用eclipse连接mysql数据库

    前言 由于总是出错,记录一下连接MySQL数据库的过程. 连接过程 1.下载MySQL并安装,这里的版本是8.0.18 2.下载MySQL的jdbc,下载后解压,个人将其保存在MySQL目录下,方便查找 3.连接数据库 (1)eclipse中选择Window-preferences-java-Build Path-User Libraries (2)点击右侧的new按钮, (3)在这里输入jdbc,选中对勾,点击ok (4)回到上一级界面,点击Add External JARs,打开到你的jdb

  • nodejs连接mysql数据库及基本知识点详解

    本文实例讲述了nodejs连接mysql数据库及基本知识点.分享给大家供大家参考,具体如下: 一.几个常用的全局变量 1.__filename获取当前文件的路径 2.__dirname获取当前文件的目录 3.process.cwd()获取当前工程的目录 二.文件的引入与导出 1.使用require引入文件 2.使用module.exports导出文件中指定的变量.方法.对象 三.node项目的搭建目录结构 demo package.json 当前项目所依赖的包或者模块     router  存

  • 用 Python 连接 MySQL 的几种方式详解

    尽管很多 NoSQL 数据库近几年大放异彩,但是像 MySQL 这样的关系型数据库依然是互联网的主流数据库之一,每个学 Python 的都有必要学好一门数据库,不管你是做数据分析,还是网络爬虫,Web 开发.亦或是机器学习,你都离不开要和数据库打交道,而 MySQL 又是最流行的一种数据库,这篇文章介绍 Python 操作 MySQL 的几种方式,你可以在实际开发过程中根据实际情况合理选择. 1.MySQL-python MySQL-python 又叫 MySQLdb,是 Python 连接 M

随机推荐