JDBC实现Mysql自动重连机制的方法详解

前言

本文主要给大家介绍的是关于JDBC实现Mysql自动重连机制的相关内容,分享出来供大家参考学习,下面来一起看看详细的介绍:

日志:using the Connector/J connection property 'autoReconnect=true' to avoid this problem

com.mysql.jdbc.CommunicationsException: The last packet successfully received from the server was58129 seconds ago.The last packet sent successfully to the server was 58129 seconds ago, which is longer than the server configured value of 'wait_timeout'. You should consider either expiring and/or testing connection validity before use in your application, increasing the server configured values for client timeouts, or using the Connector/J connection property 'autoReconnect=true' to avoid this problem.

查了一下,原来是MySQL超时设置的问题

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

解决办法:

第一种:如果不用hibernate的话, 则在 connection url中加参数: autoReconnect=true

 jdbc.url=jdbc:mysql://ipaddress:3306/database?autoReconnect=true&autoReconnectForPools=true

第二种:用hibernate的话, 加如下属性:

 <property name="connection.autoReconnect">true</property>
 <property name="connection.autoReconnectForPools">true</property>
 <property name="connection.is-connection-validation-required">true</property>

第三种:要是还用c3p0连接池:

 <property name="hibernate.c3p0.acquire_increment">1</property>
 <property name="hibernate.c3p0.idle_test_period">0</property>
 <property name="hibernate.c3p0.timeout">0</property>
 <property name="hibernate.c3p0.validate">true</property>

第四种:最不好的解决方案

使用Connector/J连接MySQL数据库,程序运行较长时间后就会报以下错误:

Communications link failure,The last packet successfully received from the server was *** millisecond ago.The last packet successfully sent to the server was ***  millisecond ago。

其中错误还会提示你修改wait_timeout或是使用Connector/J的autoReconnect属性避免该错误。

后来查了一些资料,才发现遇到这个问题的人还真不少,大部分都是使用连接池方式时才会出现这个问题,短连接应该很难出现这个问题。

这个问题的原因:

MySQL服务器默认的“wait_timeout”是28800秒即8小时,意味着如果一个连接的空闲时间超过8个小时,MySQL将自动断开该 连接,而连接池却认为该连接还是有效的(因为并未校验连接的有效性),当应用申请使用该连接时,就会导致上面的报错。

⑴.按照错误的提示,可以在JDBC URL中使用autoReconnect属性,实际测试时使用了autoReconnect=true& failOverReadOnly=false,不过并未起作用,使用的是5.1版本,可能真像网上所说的只对4之前的版本有效。

⑵.没办法,只能修改MySQL的参数了,wait_timeout最大为31536000即1年,在my.cnf中加入:

[mysqld]

wait_timeout=31536000

interactive_timeout=31536000

重启生效,需要同时修改这两个参数。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对我们的支持。

(0)

相关推荐

  • Spring jdbc中数据库操作对象化模型的实例详解

    Spring jdbc中数据库操作对象化模型的实例详解 Spring Jdbc数据库操作对象化 使用面向对象方式表示关系数据库的操作,实现一个线程安全可复用的对象模型,其顶级父类接口RdbmsOperation. SqlOperation继承该接口,实现数据库的select, update, call等操作. 1.查询接口:SqlQuery 1) GenericSqlQuery, UpdatableSqlQuery, MappingSqlQueryWithParameter 2) SqlUpda

  • java使用JDBC动态创建数据表及SQL预处理的方法

    本文实例讲述了java使用JDBC动态创建数据表及SQL预处理的方法.分享给大家供大家参考,具体如下: 这两天由于公司的需求,客户需要自定义数据表的字段,导致每张表的字段都不是固定的而且很难有一个通用的模板去维护,所以就使用JDBC动态去创建数据表,然后通过表的字段动态添加数据,数据的来源主要是用户提供的Excel直接导入到数据库中. 如果考虑到字段的类型,可以通过反射的机制去获取,现在主要用户需求就是将数据导入到数据库提供查询功能,不能修改,所以就直接都使用String类型来处理数据更加便捷.

  • JDBC常用接口总结

    本文主要向大家介绍JDBC常用的接口都有哪些,下面来看看具体内容. 1.Driver接口 对于每一个数据库驱动程序都必须实现Driver接口,在编写程序时,当需要连接数据库的时候就需要装载由数据库厂商提供的数据库驱动程序,装载的方式如下: Class.forname("jdbc.driver_class_name"); 同时要注意的就是在使用Class.forname时首先需要引入java.sql包.下面这段代码就是装载SQL Server数据库驱动程序的一段代码: import ja

  • 浅谈 JDBC 元数据

    Java 通过JDBC获得连接以后,得到一个Connection 对象,可以从这个对象获得有关数据库管理系统的各种信息,包括数据库中的各个表,表中的各个列,数据类型,触发器,存储过程等各方面的信息.根据这些信息,JDBC可以访问一个实现事先并不了解的数据库. 获取这些信息的方法都是在DatabaseMetaData类的对象上实现的,而DataBaseMetaData对象是在Connection对象上获得的. DatabaseMetaData 类中提供了许多方法用于获得数据源的各种信息,通过这些方

  • 关于JDBC的简单封装(实例讲解)

    如下所示: import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; /** * 数据库连接工具 * @author 2017 * */ public class DbTool { /** * 数据库的类 */ private static final String ORACLE_DRIVER = "oracle.

  • JDBC实现Mysql自动重连机制的方法详解

    前言 本文主要给大家介绍的是关于JDBC实现Mysql自动重连机制的相关内容,分享出来供大家参考学习,下面来一起看看详细的介绍: 日志:using the Connector/J connection property 'autoReconnect=true' to avoid this problem com.mysql.jdbc.CommunicationsException: The last packet successfully received from the server was

  • JDBC连接mysql处理中文时乱码解决办法详解

    JDBC连接mysql处理中文时乱码解决办法详解 近日,整合的项目需要跟一个比较老版本的mysql服务器连接,使用navicat查看,发现此mysql服务器貌似没有设置默认编码,而且从操作此mysql的部分php文件看,应该是使用的gb2312的编码,但是,直接使用jdbc操作,从库中读取出来的中文全都是乱码. 一开始,使用类似entity.setDepartName(new String(rs.getString("hg").getBytes("gbk"), &q

  • mysql表名忽略大小写配置方法详解

    linux下mysql默认是要区分表名大小写的.mysql是否区分大小写设置是由参数lower_case_table_names决定的,其中: 1)lower_case_table_names = 0  区分大小写(即对大小写不敏感),默认是这种设置.这样设置后,在mysql里创建的表名带不带大写字母都没有影响,都可以正常读出和被引用. 2)lower_case_table_names = 1  不区分大小写(即对大小写敏感).这样设置后,表名在硬盘上以小写保存,MySQL将所有表名转换为小写存

  • Mysql优化order by语句的方法详解

    本篇文章我们将了解ORDER BY语句的优化,在此之前,你需要对索引有基本的了解,不了解的老少爷们可以先看一下我之前写过的索引相关文章.现在让我们开始吧. MySQL中的两种排序方式 1.通过有序索引顺序扫描直接返回有序数据 因为索引的结构是B+树,索引中的数据是按照一定顺序进行排列的,所以在排序查询中如果能利用索引,就能避免额外的排序操作.EXPLAIN分析查询时,Extra显示为Using index. 2.Filesort排序,对返回的数据进行排序 所有不是通过索引直接返回排序结果的操作都

  • Python自动操作Excel文件的方法详解

    目录 工具 读取Excel文件内容 写入Excel文件内容 Excel文件样式调整 设置表头的位置 设置单元格的宽高 总结 工具 python3.7 Pycharm Excel xlwt&xlrd 读取Excel文件内容 当前文件夹下有一个名为“股票数据.xlsx”的Excel文件,可以按照下列代码方式来操作它. import xlrd # 使用xlrd模块的open_workbook函数打开指定Excel文件并获得Book对象(工作簿) wb = xlrd.open_workbook('股票数

  • PHP中的自动加载操作实现方法详解

    本文实例讲述了PHP中的自动加载操作实现方法.分享给大家供大家参考,具体如下: what is 自动加载? 或许你已经对自动加载有所了解.简单描述一下:自动加载就是我们在new一个class的时候,不需要手动去写require来导入这个class.php文件,程序自动帮我们加载导入进来.这是php5.1.2(好像是)版本新加入一个功能,他解放了程序员的双手,不需要手动写那么多的require,变得有那么点智能的感觉. 自动加载可以说是现代PHP框架的根基,任何牛逼的框架或者架构都会用到它,它发明

  • MySQL用户权限验证与管理方法详解

    本文实例讲述了MySQL用户权限验证与管理方法.分享给大家供大家参考,具体如下: 一.Mysql权限分两阶段验证 1. 服务器检查是否允许连接:用户名.密码,主机地址. 2. 检查每一个请求是否有权限实施. 二.Mysql权限列表 权限 权限级别 权限说明 create 数据库.表或索引 创建数据库.表或索引权限 drop 数据库或表 删除数据库或表权限 grant option 数据库.表或保存的程序 赋予权限选项 references 数据库或表 外键权限 alter 表 更改表,比如添加字

  • MySQL解决SQL注入的另类方法详解

    本文实例讲述了MySQL解决SQL注入的另类方法.分享给大家供大家参考,具体如下: 问题解读 我觉得,这个问题每年带来的成本可以高达数十亿美元了.本文就来谈谈,假定我们有如下 SQL 模板语句: select * from T where f1 = '{value1}' and f2 = {value2} 现在我们需要根据用户输入值填充该语句: value1=hello value2=5 我们得到了下面的 SQL 语句,我们再提交给数据库: select * from T where f1='h

  • MySQL服务器线程数的查看方法详解

    本文实例讲述了MySQL服务器线程数的查看方法.分享给大家供大家参考,具体如下: mysql重启命令: /etc/init.d/mysql restart MySQL服务器的线程数需要在一个合理的范围之内,这样才能保证MySQL服务器健康平稳地运行.Threads_created表示创建过的线程数,通过查看Threads_created就可以查看MySQL服务器的进程状态. mysql> show global status like 'Thread%'; +------------------

  • Java连接Mysql 8.0.18版本的方法详解

    关于Java和Mysql 8.0.18版本的连接方式,供大家参考,具体内容如下 1.官网下载mysql-server.(Connector/J记得安装) 安装教程参考: mysql 8.0.18 安装配置方法图文教程 mysql 8.0.18.zip安装配置方法图文教程(windows 64位) 2.安装完后在C盘找到mysql-connector-java-8.0.18.jar 3.记住路径后再idea中选择File-Project Structure-Modules-+号键添加jar包 4.

随机推荐