联接MySql请求超时断掉出错难题

2021-04-13 15:48 jianzhan
应用Mysql数据信息库时,最使人头数疼的一个难题便是不确定时候出現联接出错出现异常Exception,相近的Exception以下(Hibernate为例子): ? 1 2 3 4 5 6 7 8 .hibernate.util.JDBCExceptionReporter - SQL Error:0, SQLState: .hibernate.util.JDBCExceptionReporte

联接MySql请求超时断掉出错难题

应用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 essfully received from the server was43200 milliseconds ago.The last packet essfully 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.exceptions.jdbc4.CommunicationsException









大多数数人碰到这一难题都是很难以相信,因为我是碰到这一难题,细细地科学研究后才发觉了实质缘故。

一、难题缘故

Mysql的配备中,有一个称为 wait_timeout 的主要参数,这一主要参数大概的含意是那样:当一个顾客端联接到MySQL数据信息库后,假如顾客端不自身断掉联接,都不做一切实际操作,MySQL数据信息库会将这一联接保存 wait_timeout 那么长期(企业是s,默认设置是28800s,也便是8钟头),超出这一時间以后,MySQL数据信息库以便节约資源,便会在数据信息库端断掉这一联接;自然,在此 wait_timeout 全过程中,假如顾客端在这里个联接上面有随意的实际操作,MySQL数据信息库都是再次刚开始测算这一時间。

那么来看,产生联接出现异常Exception的缘故便是由于大家的程序和MySQL数据信息库的联接超出了 wait_timeout 時间,Mysql网络服务器端将其断掉了,可是大家的程序再度应用这一联接时沒有做一切分辨,因此就挂掉。

那怎样处理这一难题呢?

二、处理方式

1. 增加Mysql配备中wait_timeout主要参数的标值。

我觉得有些人立即就增加到一年了,也是有人说这一值较大也便是二十一天,即便值设的再大,MySQL也就只鉴别二十一天(这一也没有实际去MySQL的文本文档中来查)。可是它是一个治标不标本兼治的方式,即便能够一年,也還是会出现断的情况下,网络服务器但是要7x二十四小时线上的。

2. 在开展数据信息库实际操作以前,开展 check 查验体制(即查验联接是不是合理)

这儿实际上有许多种计划方案,Hibernate自身有配备方式,每个联接池(c3p0等)也是有配备方式,这儿大家以c3p0的Hibernate配备为例子。

?









1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16





session-factory

property name= .hibernate.dialect.MySQL5InnoDBDialect /property

property name= hibernate..mysql.jdbc.Driver /property

property name= hibernate.connection.useUnicode true /property

property name= hibernate.connection.characterEncoding UTF-8 /property

property name= hibernate.show_sql true /property

!-- c3p0在大家应用的Hibernate版本号中内置,无需免费下载,立即应用 --

property name= hibernate..hibernate.connection.C3P0ConnectionProvider /property

property name= hibernate.c3p0.min_size 5 /property

property name= hibernate.c3p0.max_size 20 /property

property name= hibernate.c3p0.timeout 1800 /property

property name= hibernate.c3p0.max_statements 50 /property

!-- 下边这句话太重要,后边有表述 --

property name= hibernate.c3p0.testConnectionOnCheckout true /property

!-- 下列就都是mapping了,省去 --

/session-factory









上边配备中最大要的便是hibernate.c3p0.testConnectionOnCheckout这一特性,它确保了大家前边说的每一次取下联接时候查验该联接是不是被关掉了。但是这一特性会对特性有一些消耗,还可以选用别的方式。

实际上也有许多种方式能够完成 check 体制,大伙儿有兴趣爱好能够多多的掌握有关专业知识。c3p0还可以无需testConnectionOnCheckout而用select 1等方式。 共享到:
文中"联接MySql请求超时断掉出错难题"由远航网站站长搜集梳理而成,仅作大伙儿学习培训与参照应用。大量网站建设实例教程尽在远航网站站长站。