失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > 连接MySql超时断开报错问题【MySQL】

连接MySql超时断开报错问题【MySQL】

时间:2020-02-17 00:57:32

相关推荐

连接MySql超时断开报错问题【MySQL】

数据库|mysql教程

数据库

数据库-mysql教程

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

oexam php源码下载,苹果电脑vscode改中文,ubuntu r png,tomcat名字的由来,猫眼评分 爬虫,php数组详解,品牌seo系统代理项目网络平台lzw

org.hibernate.util.JDBCExceptionReporter - SQL Error:0, SQLState: 08S01org.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 .hibernate.event.def.AbstractFlushingEventListener - Could not synchronize database state with sessionorg.hibernate.exception.JDBCConnectionException: Could not execute JDBC batch updatecom.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Connection.close() has already been called. Invalid operation in this .hibernate.util.JDBCExceptionReporter - SQL Error:0, SQLState: 08003org.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

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

获取安卓软件源码,vscode 多重选择,ubuntu 查看com,京太作者tomcat,python爬虫版本,php5.3的命名空间,seo新手入门自学营销,手机网站添加收藏代码,doyo 模板 下载lzw

A、问题原因

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

好省网站源码,ubuntu麒麟版安装,爬虫程序健康探针,php smpss,av 站长seolzw

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

那如何解决这个问题呢?

B、解决方法

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

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

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

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

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等方法。

如果觉得《连接MySql超时断开报错问题【MySQL】》对你有帮助,请点赞、收藏,并留下你的观点哦!

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