900字范文,内容丰富有趣,生活中的好帮手!
900字范文 > 连接MySql超时断开报错问题

连接MySql超时断开报错问题

时间:2024-06-16 17:20:22

相关推荐

连接MySql超时断开报错问题

数据库|mysql教程

连接,MySql,超时,断开,报错,问题

数据库-mysql教程

哪里有手游源码买,vscode无法创建文件,mingw ubuntu,tomcat 并发线程数,sqlite考试,成都 网页设计,不能识别access数据库,阿里云服务器释放恢复,php评论插件,前端框架 认证,爬虫云数据,php密钥,北京seo快速排名,springboot打日志,响应式自适应网站,个人主页网页设计源代码,响应式分模块注册模板,仿站教程 前台后台,移动页面图片轮播图,jsp药店管理系统源码,响应式旅游网站源码程序lzw

使用Mysql数据库时,最让人头疼的一个问题就是不定时会出现连接报错异常Exception,类似的Exception如下(Hibernate为例): ? 1 2 3 4 5 6 7 8 9 10 org.hibernate.util.JDBCExceptionReporter – SQL Error:0, SQLState: 08S01 org.hibernate.util.JDBCExcept

二维码收款的业务网站源码,改变vscode的颜色,ubuntu python学习,tomcat开启启动日志,身上爬虫,php订单系统 开源,seo优化收费软件分类,html特效网站源码,html5手机端商城模板下载lzw

H5企业源码,vscode缩进8个空格,修改ubuntu 引导,tomcat 架构和原理,爬虫编程招聘,php如何调用函数返回值,seo优化是属于什么类型,iis建立好网站 怎么打开,企业联盟模板lzw

使用Mysql数据库时,最让人头疼的一个问题就是不定时会出现连接报错异常Exception,类似的Exception如下(Hibernate为例):

?

1

2

3

4

5

6

7

8

9

10

org.hibernate.util.JDBCExceptionReporter – SQL Error:0, SQLState: 08S01

org.hibernate.util.JDBCExceptionReporter – The last packet successfully received from the server was43200 milliseconds ago.The last packet sent successfully to the server was 43200 milliseconds 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 ‘autoReconnect=true’ to avoid this problem.

org.hibernate.event.def.AbstractFlushingEventListener – Could not synchronize database state with session

org.hibernate.exception.JDBCConnectionException: Could not execute JDBC batch update

com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Connection.close() has already been called. Invalid operation in this state.

org.hibernate.util.JDBCExceptionReporter – SQL Error:0, SQLState: 08003

org.hibernate.util.JDBCExceptionReporter – No operations allowed after connection closed. Connection was implicitly closed due to underlying exception/error:

** BEGIN NESTED EXCEPTION **

com.mysql.jdbc.municationsException

大多数人遇到这个问题都会很费解,我也是遇到这个问题,细细研究后才发现了本质原因。

A、问题原因

Mysql的配置中,有一个叫做“wait_timeout”的参数,这个参数大致的意思是这样:当一个客户端连接到MySQL数据库后,如果客户端不自己断开连接,也不做任何操作,MySQL数据库会将这个连接保留”wait_timeout”这么长时间(单位是s,默认是28800s,也就是8小时),超过这个时间之后,MySQL数据库为了节省资源,就会在数据库端断开这个连接;当然,在此”wait_timeout”过程中,如果客户端在这个连接上有任意的操作,MySQL数据库都会重新开始计算这个时间。

这么看来,发生连接异常Exception的原因就是因为我们的程序和MySQL数据库的连接超过了”wait_timeout”时间,Mysql服务器端将其断开了,但是我们的程序再次使用这个连接时没有做任何判断,所以就挂了。

那如何解决这个问题呢?

B、解决方法

1. 延长Mysql配置中wait_timeout参数的数值。

我看有的人直接就延长到一年了,也有人说这个值最大也就是21天,即使值设的再大,MySQL也就只识别21天(这个我没有具体去MySQL的文档中去查)。但是这是一个治标不治本的方法,即使可以一年,,也还是会有断的时候,服务器可是要7×24小时在线的。

2. 在进行数据库操作之前,进行“check”检查机制(即检查连接是否有效)

这里其实有好多种方案,Hibernate本身有配置方法,各个连接池(c3p0等)也有配置方法,这里我们以c3p0的Hibernate配置为例。

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

org.hibernate.dialect.MySQL5InnoDBDialect

com.mysql.jdbc.Driver

true

UTF-8

true

org.hibernate.connection.C3P0ConnectionProvider

5

20

1800

50

true

上面配置中最重要的就是hibernate.c3p0.testConnectionOnCheckout这个属性,它保证了我们前面说的每次取出连接时会检查该连接是否被关闭了。不过这个属性会对性能有一些损耗,也可以采用其他方法。

其实还有很多种方法可以实现”check”机制,大家有兴趣可以多多了解相关知识。c3p0也可以不用testConnectionOnCheckout而用select 1等方法。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。