mysql5 autoreconnect_Mysql5的auto Reconnect错误

2023-10-30

一、解决方案一

最近在一个J2EE项目的开发过程中,遇到了这样的问题:

在服务器上部署好这个Web系统后,这时访问系统是很正常的。当把服务器的时间(例如:2008-03-31)加一天或更多天(例如:2008-04-01,2008-04-02...),这时再访问这个Web系统,报出如下的异常:

QUOTE:

com.mysql.jdbc.CommunicationsException: Communications link failure due to underlying exception:

** BEGIN NESTED EXCEPTION **

java.io.EOFException

MESSAGE: Can not read response from server. Expected to read 4 bytes, read 0 bytes before connection was unexpectedly lost.

STACKTRACE:

java.io.EOFException: Can not read response from server. Expected to read 4 bytes, read 0 bytes before connection was unexpectedly lost.

at com.mysql.jdbc.MysqlIO.readFully(MysqlIO.java:1997)

at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:2411)

at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:2916)

at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1631)

at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:1723)

at com.mysql.jdbc.Connection.execSQL(Connection.java:3250)

at com.mysql.jdbc.Connection.setAuto Commit(Connection.java:5395)

...

我们首先判断是连接池出了问题,即当系统时间改变后,数据库连接发现超时,因此需要重新连接或完全重建连接池。我们换用了一下数据库,如果 使用Oracle数据库,同样的修改不会出现问题,系统运行正常,根据不会出现这样的异常。这就说明了出现这个异常是Mysql相关的,通过查阅资料得知 可能和Mysql的运行参数(超时)有关,顺着这个思路我们来分析Mysql的一些运行参数。

在MySQL Command Line Client中执行show variables like '%timeout%';如下图所示:

在图中我们可以看到有两个变量wait_timeout和interactive-timeout,它们的默认值都为28800秒,即为8小时。也就是说默认情况下,Mysql在经过8小时(28800秒)不使用后会自动关闭已打开的连接。

为 了解决这个问题,对于MySQL5之前的版本,如Mysql4.x,只需要修改连接池配置中的URL,添加一个参 数:autoReconnect=true,如果是MySQL5及以后的版本,则需要修改my.cnf(或者my.ini)文件,在[mysqld]后面 添加上:

wait_timeout = n

interactive-timeout = n

n为服务器关闭交互式连接前等待活动的秒数。

可是就部署而言每次修改my.ini比较麻烦,而且n等于多少才是合适的呢?所以这个解决办法不好。

怎 么才能比较好的解决这个问题呢?通过仔细分析,原因大致为:当修改系统日期后Mysql自动关闭已打开的连接,可以数据库连接池(DBCP)还认为这些连 接是活动的,如果这时有请求(需要执行读写数据库的操作),连接池就用一个连接去操作数据库,而这个连接在Mysql的连接池中并不存在,所以会出现以上 的异常。如果一个连接在和Mysql建立连接时能检查就不会有这样的问题了。

这时我们同事想起了他以前用过的一个数据库连接池 proxool,它有两个属性:一个是test-before-use,还有一个是test-after-use,这两个属性就是在使用前和使用后都要进 行对连接的检查,如果连接无效就扔掉再创建一个新的连接,它们的解释如下:

test-before-use:

If you set this to true then each connection is tested (with whatever is defined in house-keeping-test-sql) before being served. If a connection fails then it is discarded and another one is picked. If all connections fail a new one is built. If that one fails then you get an SQLException saying so.

test-after-use:

If you set this to true then each connection is tested (with whatever is defined in house-keeping-test-sql) after it is closed (that is, returned to the connection pool). If a connection fails then it is discarded.

于是我们在项目中换上proxool的连接池,再运行并访问系统,更改系统时间,再访问,一切OK,问题就这样解决了!

不但如此,proxool的连接池中的连接的数量,活动数以及每个连接的的具体情况都可以一目了然的看到,如下图所示:

通过上面的测试和分析,针对于Mysql5数据库,选择proxool数据库连接池是比较合适的。

c3p0的连接池有 idleConnectionTestPeriod 属性,可以设置一段时间后连接池自动测试执行,保持连接开放,效果也是一样的。

二、解决方案二

MySQL官方不推荐使用autoReconnect=true,参见http://bugs.mysql.com/bug.php?id=5020

需要另外找别的办法来解决超过8小时,链接断开的问题。

由于问题产生的根本原因在于服务到数据库的连接长时间没活动,既然重新连接的办法无效,就可以尝试另外一种办法,就是反空闲。

自己写一个线程来反空闲的话,比较麻烦。

最后在网上找到一个办法。为hibernate配置连接池,推荐用c3p0,然后配置c3p0的反空闲设置idle_test_period,只要小于MySQL的wait timeout即可。

在hibernate.cfg.xml中增加下面几项:

org.hibernate.connection.C3P0ConnectionProvider

5

30

1800 

50 

120  

true

三、解决方案三

解决办法:

FuIU1|

!@]{k?j

如果连接闲置8小时 (8小时内没有进行数据库操作), mysql就会自动断开连接, 要重启tomcat.

7,yVM

不用hibernate的话, connection url加参数: autoReconnect=true

YHy&; -5

用hibernate的话, 加如下属性:

a_Zbt

truevm sFu(i

trueP @:f+

true

uY}.T�k

要是还用c3p0连接池:

H

1'zcyrR"

0\F f%m

0ug(QB

true

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

mysql5 autoreconnect_Mysql5的auto Reconnect错误 的相关文章

  • 电信光纤天翼网关将默认的路由模式修改为桥接模式

    前两年将家里的电信宽带升级到光纤 光猫也随之进行了升级 当时升级好后 电信工作人员介绍说新的光猫带有wifi功能 如果连接路由器可以不用配置路由器的拨号设置 说是升级到光纤后可以直接连接网线上网 不用再拨号了 当时也没怎么在意 网线连上路由
  • 基于 SpringBoot 的 4S店车辆管理系统,可作为毕业设计

    博主介绍 程序员徐师兄 7年大厂程序员经历 全网粉丝30W Csdn博客专家 掘金 华为云 阿里云 InfoQ等平台优质作者 专注于Java技术领域和毕业项目实战 文章目录 1 简介 2 技术栈 3 功能总览 4 系统设计 4 1 系统设计
  • 1023 组最小数

    题目 给定数字 0 9 各若干个 你可以以任意顺序排列这些数字 但必须全部使用 目标是使得最后得到的数尽可能小 注意 0 不能做首位 例如 给定两个 0 两个 1 三个 5 一个 8 我们得到的最小的数就是 10015558 现给定数字 请
  • CURL解析超时的解决方案

    背景 项目中需要在抓取纷享销客CRM图片上传到OSS 调用OssClient php时 容易发生解析超时 多重试几次就ok 错误提示 2019 04 08 19 41 01 lumen DEBUG 出错文件 home zrj www adm
  • elementui——el-form动态表单props正确写法,如何使用 validateField

    el form动态表单props正确写法 如何使用 validateField
  • Pywinauto+某应用程序(学习至第9讲)--受阻

    文章目录 Pywinauto 某应用程序 学习至第9讲 受阻 问题点 1 安装第三方库 2 自动化的切入点 后端技术 程序个数 3 程序辅助检查工具的使用 inspect spy 4 pywinauto打开指定的应用程序 XXX exe 5
  • Matroska文件的SRT Subtitle

    1 SRT简单介绍 SRT是一种比较流行的文本字幕 因为是文本格式 所以就比较小了 因为其制作规范简单 一句时间代码 一句字幕 使得制作修改就相当简单 配合上 style文件还能让srt自带一些字体上的特效等 SRT文件中的字幕包括四个部分
  • 批量调整word 图片大小

    打开文档后 按Alt F11 在左边Porject下找到ThisDocument 右键插入模块 贴上下面的Sub Macro For Each iShape In ActiveDocument InlineShapesiShape Heig
  • 【安卓学习之常见问题】文件分享--文件不存在

    安卓学习之常见问题 文件分享 文件不存在 系列文章目录 提示 这里是收集了和文件分享有关的文章 安卓学习之常见问题 android路径及文件问题 安卓学习之常见问题 文件分享 文件不存在 文章目录 安卓学习之常见问题 文件分享 文件不存在
  • LabVIEW深度相机与三维定位实战(下)

    博客主页 virobotics的CSDN博客 LabVIEW深度学习 人工智能博主 所属专栏 LabVIEW深度学习实战 上期文章 LabVIEW深度相机与三维定位实战 上 如觉得博主文章写的不错或对你有所帮助的话 还望大家多多支持呀 欢迎
  • 什么是内存泄漏,一看就懂,一学就会!!大白话解释内存泄漏!通俗易懂!

    在 32 位环境下 一个程序占用 4GB 的内存 其中 内核空间 是被操作系统占用的 我们没法直接干预 保留区域 也不用来存储数据 只用作一些特殊目的 比如 你可以让空指针指向这里 除了这两个区域 剩下的那些内存才是被我们自己编写的程序所占
  • Oracle数据库常见版本

    在Oracle数据库的发展中 数据库一直处于不断升级状态 有以下几个版本 Oracle 8 Oracle 8i Oracle 8i表示Oracle正式向Internet上开始发展 其中i表示就是internet Oracle 9i Orac
  • 带你玩转Spring Cloud Tencent(一)概述

    项目地址 spring cloud tencent 介绍 Spring Cloud Tencent 是腾讯开源的一站式微服务解决方案 Spring Cloud Tencent 实现了Spring Cloud 标准微服务 SPI 开发者可以基
  • PHP密码复杂性验证,JS检查密码强度 检查密码复杂度

    pass keyup function e var strongRegex new RegExp 8 A Z a z 0 9 W g var mediumRegex new RegExp 7 A Z a z A Z 0 9 a z 0 9
  • 电信光猫天翼网关usb插U盘共享文件

    ftp用不了 samba可以用 1 在电脑文件管理器中输入 192 168 1 1打开 在弹出框中输入光猫背后的账号密码登录即可打开共享的U盘 2 在手机ES文件管理器中 点右上角三点 新建 在弹出框中填入192 168 1 1和选择sam
  • Nginx 官网及中文官网

    英语官方 http nginx org 中文文档 http www nginx cn doc 转载于 https blog 51cto com hacker3389 1877270
  • 什么是大数据(转自知乎)

    声明 纯属个人收藏用 什么是大数据 大数据只是一个空洞的商业术语 就跟所谓的商业智能一样空洞无物 当然 这并不是说大数据没有意义 只是对于不同的人有不同的含义 A 对于投资人和创业者而言 大数据是个热门的融资标签 就和前几年流行的 SoLo
  • 磁盘快照技术

    一 概念解释 像照相机一样 机器快门一闪 很快就把刚刚的人像停留在了相纸上 存储系统中的数据 快照 与我们生活中所说的 照片 非常相似 所不同的是 照片的对象不是人 而是数据 如同照片留住了我们过去的摸样和岁月 快照把数据在某一时刻的映像也
  • 【数据结构】——顺序表介绍(独家介绍,小白必看!!)

    重点和易错点都用彩笔标记出来了 放心食用 数据结构分为线性表和非线性表 今天我们要学习的顺序表就是线性表中的一个小类 那么 何为线性表 线性表是指n个具有相同性质的数据元素的有限序列 常见的线性表有 顺序表 链表 栈 队列 字符串等等 注意

随机推荐

  • java非递归遍历二叉树 - Kaiqisan

    大家好 都吃晚饭了吗 我是Kaiqisan 是一个已经走出社恐的一般生徒 都说所有的递归都可以使用非递归的方式来解决 所以这次来一起康康非递归版本的二叉树的遍历 递归的本质就是不断往栈中塞入待执行代码 然后在代码块被执行的时候就会被调用执行
  • java时间格式化错误_java – SimpleDateFormat显示错误的分钟,秒和毫秒

    我已经编写了这个示例程序 我希望将日期转换为另一种格式 使用简单的日期格式时 我看不到预期的日期 public class TestDate param args public static void main String args Si
  • 聊一聊如何用IDEA追踪Bug?

    Debug用来追踪代码的运行流程 通常在程序运行过程中出现异常 启用Debug模式可以分析定位异常发生的位置 以及在运行过程中参数的变化 通常我们也可以启用Debug模式来跟踪代码的运行流程去学习三方框架的源码 Debug开篇 首先看下ID
  • 仅仅上线一小时,下载量就破10W!阿里内部Java性能优化实战手册

    祸兮福之所倚福兮祸之所伏 上学的时候对这句话不以为然 但是在社会上走的时间越长越觉得有道理 前不久好兄弟和领导闹矛盾裸辞了 身为好兄弟的我总不能干看着吧 总要帮他找工作的 你们应该不会想我和他一起裸辞吧 大学的师兄有好几个在大厂 平常关系还
  • 在 Dockerfile 中 CMD 和ENTRYPOINT可以混着用吗?

    在 Dockerfile 中 CMD 和ENTRYPOINT可以混着用吗 在 Dockerfile 中 CMD 和 ENTRYPOINT 是两个不同的指令 它们可以单独使用 也可以结合使用 CMD 指令用于指定容器启动时默认执行的命令 它可
  • 利用回调函数消灭大量分支语句if,case

    1 背景 有这样一个场景 常见的通讯程序中 根据不同的消息类型 调用不同的处理函数 类似于处理登陆 退出登陆 发送消息等类型 上古操作可能会是这样的代码 void dealLogin std cout lt lt received logi
  • Android实现获取应用程序相关信息列表的方法

    本文所述为Androdi获取手机应用列表的方法 比如获取到Android应用的软件属性 大小和应用程序路径 应用名称等 获取所有已安装的Android应用列表 包括那些卸载了的 但没有清除数据的应用程序 同时在获取到应用信息的时候 判断是不
  • 替换字符串中的括号内容(java)

    问题描述 给你一个字符串 s 它包含一些括号对 每个括号中包含一个 非空 的键 比方说 字符串 name is age yearsold 中 有 两个 括号对 分别包含键 name 和 age 你知道许多键对应的值 这些关系由二维字符串数组
  • micropython 固件开发_Micropython编译固件的操作步骤

    目标 编译STM32F4固件并刷入到我们的开发板 STM32F407VET6 1 在Linux系统下进行编译操作 windows用户可以在虚拟机下运行Linux系统 推荐下载kali Linux系统 https www kali org d
  • 16个推荐系统开放公共数据集整理分享

    本文由深度学习与NLP编译 本文主要整理了一些与推荐系统相关的高质量的数据集 整理自Stack Overflow 一些文章 推荐站点和学术实验 其中 大多数数据集都是免费 开放的 但有些不是 需要获得许可或引用作者的工作才能使用 此外 其中
  • 微信云开发——日记小程序

    真正的大师 永远都怀着一颗学徒的心 一 项目简介 前一段时间在网上看到了一个云笔记的小程序 感觉挺不错的 闲暇之余 把他改造了一波 改成了一个专门写日记的小程序 同时 还增加了类似广场的小功能 就是可以把日记设置成公开 让所有的人都能看到
  • redis持久化配置

    redis有两种持久化方式 RDB和AOF 1 RDB配置方式 默认情况下 是快照RDB的持久化方式 将内存中的数据以快照的方式写入二进制文件中 默认的文件名是dump rdb redis conf默认配置 save 900 1 save
  • java多个jdk切换不同版本无法切换且上移环境JAVA_HOME无效的解决方案

    背景 我电脑上之前安好了java19 因为一些原因要下java1 8 发现可以设置计算机里的多个jdk版本 于是兴冲冲的开始了 网上的教程很详细 我也不啰嗦 前面进行的一切顺利 但是我始终无法切换对应的版本号 一直是原来的java19 后面
  • volatile概念详解及使用场景

    文章目录 一 volatile关键字特性 1 概念 2 特性 可见性 有序性 禁止指令重排序 原子性 二 使用场景 模式1 状态标志 模式2 独立观察 independent observation 模式3 一次性安全发布 模式4 vola
  • 1.1.2 python基本数据类型与运算符

    本章引言 任何计算机语言的学习都离不开其基础中的基础 即数据类型和运算 所以要学好一门语言必须具有扎实的基础 后期是否能够灵活使用就取决于第二章 第三章内容是否深而透 变量含义 用来存储一些之后可能会变化的值 对科比投篮ID为 1 的一次投
  • 输入入栈序列判断出栈序列是否合法(c语言实现)

    题目 分别给定入栈序列和出栈序列 然后判断出栈序列是否合法 如入栈序列是 6 5 4 3 2 1 出栈序列 4 5 3 1 2 6 是合法的 3 4 6 5 2 1 是不合法的 思路 判断出栈序列是否合法的标准是 栈顶如果是需要出栈的元素
  • Unity Code  鼓励师 插件

    使用 Visual Studio Code 编写代码 有隐藏福利插件设置哦 1 打开 Code 在扩展 搜索 鼓励 多种 插件 供你选 2 看看介绍 可以自定义哦 自己安装体验吧 3 还可以使用 蔡徐坤鼓励师 4 好想 体验 有真人 鼓励师
  • c++--解决cin输入流中遇到空格结束问题

    解决cin输入流中遇到空格结束问题 cout lt lt 请输一个字符串 lt
  • 基于stm32f1的内部读写flash

    flash是存储芯片的一种 通过特定的程序可以修改里面的数据 FLASH在电子以及半导体领域内往往表示Flash Memory的意思 即平时所说的 闪存 全名叫Flash EEPROM Memory 它结合了ROM和RAM的长处 不仅具备电
  • mysql5 autoreconnect_Mysql5的auto Reconnect错误

    一 解决方案一 最近在一个J2EE项目的开发过程中 遇到了这样的问题 在服务器上部署好这个Web系统后 这时访问系统是很正常的 当把服务器的时间 例如 2008 03 31 加一天或更多天 例如 2008 04 01 2008 04 02