最新文章專題視頻專題問(wèn)答1問(wèn)答10問(wèn)答100問(wèn)答1000問(wèn)答2000關(guān)鍵字專題1關(guān)鍵字專題50關(guān)鍵字專題500關(guān)鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關(guān)鍵字專題關(guān)鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
問(wèn)答文章1 問(wèn)答文章501 問(wèn)答文章1001 問(wèn)答文章1501 問(wèn)答文章2001 問(wèn)答文章2501 問(wèn)答文章3001 問(wèn)答文章3501 問(wèn)答文章4001 問(wèn)答文章4501 問(wèn)答文章5001 問(wèn)答文章5501 問(wèn)答文章6001 問(wèn)答文章6501 問(wèn)答文章7001 問(wèn)答文章7501 問(wèn)答文章8001 問(wèn)答文章8501 問(wèn)答文章9001 問(wèn)答文章9501
當(dāng)前位置: 首頁(yè) - 科技 - 知識(shí)百科 - 正文

連接MySql超時(shí)斷開(kāi)報(bào)錯(cuò)問(wèn)題_MySQL

來(lái)源:懂視網(wǎng) 責(zé)編:小采 時(shí)間:2020-11-09 19:09:13
文檔

連接MySql超時(shí)斷開(kāi)報(bào)錯(cuò)問(wèn)題_MySQL

連接MySql超時(shí)斷開(kāi)報(bào)錯(cuò)問(wèn)題_MySQL:使用Mysql數(shù)據(jù)庫(kù)時(shí),最讓人頭疼的一個(gè)問(wèn)題就是不定時(shí)會(huì)出現(xiàn)連接報(bào)錯(cuò)異常Exception,類(lèi)似的Exception如下(Hibernate為例):org.hibernate.util.JDBCExceptionReporter - SQL Error:0, SQLState: 08S01org.hib
推薦度:
導(dǎo)讀連接MySql超時(shí)斷開(kāi)報(bào)錯(cuò)問(wèn)題_MySQL:使用Mysql數(shù)據(jù)庫(kù)時(shí),最讓人頭疼的一個(gè)問(wèn)題就是不定時(shí)會(huì)出現(xiàn)連接報(bào)錯(cuò)異常Exception,類(lèi)似的Exception如下(Hibernate為例):org.hibernate.util.JDBCExceptionReporter - SQL Error:0, SQLState: 08S01org.hib

使用Mysql數(shù)據(jù)庫(kù)時(shí),最讓人頭疼的一個(gè)問(wèn)題就是不定時(shí)會(huì)出現(xiàn)連接報(bào)錯(cuò)異常Exception,類(lèi)似的Exception如下(Hibernate為例):

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 problem.org.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 state.org.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.exceptions.jdbc4.CommunicationsException

大多數(shù)人遇到這個(gè)問(wèn)題都會(huì)很費(fèi)解,我也是遇到這個(gè)問(wèn)題,細(xì)細(xì)研究后才發(fā)現(xiàn)了本質(zhì)原因。

一、問(wèn)題原因

Mysql的配置中,有一個(gè)叫做“wait_timeout"的參數(shù),這個(gè)參數(shù)大致的意思是這樣:當(dāng)一個(gè)客戶端連接到MySQL數(shù)據(jù)庫(kù)后,如果客戶端不自己斷開(kāi)連接,也不做任何操作,MySQL數(shù)據(jù)庫(kù)會(huì)將這個(gè)連接保留"wait_timeout"這么長(zhǎng)時(shí)間(單位是s,默認(rèn)是28800s,也就是8小時(shí)),超過(guò)這個(gè)時(shí)間之后,MySQL數(shù)據(jù)庫(kù)為了節(jié)省資源,就會(huì)在數(shù)據(jù)庫(kù)端斷開(kāi)這個(gè)連接;當(dāng)然,在此"wait_timeout"過(guò)程中,如果客戶端在這個(gè)連接上有任意的操作,MySQL數(shù)據(jù)庫(kù)都會(huì)重新開(kāi)始計(jì)算這個(gè)時(shí)間。

這么看來(lái),發(fā)生連接異常Exception的原因就是因?yàn)槲覀兊某绦蚝蚆ySQL數(shù)據(jù)庫(kù)的連接超過(guò)了”wait_timeout"時(shí)間,Mysql服務(wù)器端將其斷開(kāi)了,但是我們的程序再次使用這個(gè)連接時(shí)沒(méi)有做任何判斷,所以就掛了。

那如何解決這個(gè)問(wèn)題呢?

二、解決方法

1. 延長(zhǎng)Mysql配置中wait_timeout參數(shù)的數(shù)值。

我看有的人直接就延長(zhǎng)到一年了,也有人說(shuō)這個(gè)值最大也就是21天,即使值設(shè)的再大,MySQL也就只識(shí)別21天(這個(gè)我沒(méi)有具體去MySQL的文檔中去查)。但是這是一個(gè)治標(biāo)不治本的方法,即使可以一年,也還是會(huì)有斷的時(shí)候,服務(wù)器可是要7x24小時(shí)在線的。

2. 在進(jìn)行數(shù)據(jù)庫(kù)操作之前,進(jìn)行“check”檢查機(jī)制(即檢查連接是否有效)

這里其實(shí)有好多種方案,Hibernate本身有配置方法,各個(gè)連接池(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這個(gè)屬性,它保證了我們前面說(shuō)的每次取出連接時(shí)會(huì)檢查該連接是否被關(guān)閉了。不過(guò)這個(gè)屬性會(huì)對(duì)性能有一些損耗,也可以采用其他方法。

其實(shí)還有很多種方法可以實(shí)現(xiàn)"check"機(jī)制,大家有興趣可以多多了解相關(guān)知識(shí)。c3p0也可以不用testConnectionOnCheckout而用select 1等方法。

聲明:本網(wǎng)頁(yè)內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問(wèn)題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

文檔

連接MySql超時(shí)斷開(kāi)報(bào)錯(cuò)問(wèn)題_MySQL

連接MySql超時(shí)斷開(kāi)報(bào)錯(cuò)問(wèn)題_MySQL:使用Mysql數(shù)據(jù)庫(kù)時(shí),最讓人頭疼的一個(gè)問(wèn)題就是不定時(shí)會(huì)出現(xiàn)連接報(bào)錯(cuò)異常Exception,類(lèi)似的Exception如下(Hibernate為例):org.hibernate.util.JDBCExceptionReporter - SQL Error:0, SQLState: 08S01org.hib
推薦度:
  • 熱門(mén)焦點(diǎn)

最新推薦

猜你喜歡

熱門(mén)推薦

專題
Top