Mysql連接無效(invalid connection)問題及解決
目錄
- Mysql連接無效invalid connection
- 解決的方案
- Mysql遠(yuǎn)程連接不生效
- 總結(jié)
Mysql連接無效invalid connection
一般連接數(shù)據(jù)庫的代碼庫都有實(shí)現(xiàn)連接池,如golang語言database/sql庫,其中SetConnMaxLifetime(d time.Duration)是用來設(shè)置連接池里每條連接關(guān)閉的時(shí)間,當(dāng)d <= 0時(shí),連接池里的連接永久重用,即永遠(yuǎn)都在連接池里,拿來就用,不管此連接是否真的有效(這里有問題,下面講)。
當(dāng)d > 0時(shí),到了時(shí)間d才會關(guān)閉連接,把連接移出連接池,但這并不是時(shí)間一到就關(guān)閉,因?yàn)楫?dāng)連接還在使用時(shí)會等連接完成之后,等下一個(gè)清理連接周期(周期為d)時(shí)會關(guān)閉連接,移出連接池。
Mysql為了防止空閑連接過多,超過了參數(shù)mysql_connection之后會拒絕新連接,mysql會自動關(guān)閉空閉連接超過wait_timeout參數(shù)的時(shí)間,會關(guān)閉使用中超過interactive_timeout參數(shù)的連接。
由于mysql會自動關(guān)閉超時(shí)連接,所以database/sql的SetConnMaxLifetime()不能設(shè)置為永久有效,要不然連接已經(jīng)被mysql關(guān)閉了,但還是拿著失效的連接使用就會報(bào)invalid connection。
解決的方案
SetConnMaxLifetime()設(shè)置的時(shí)間小于wait_timeout就行,一般建議wait_timeout/2。
Mysql遠(yuǎn)程連接不生效
記錄一下,一般這種情況都是設(shè)置 mysql 表中對應(yīng) root 用戶的 Host 從 localhost 改為 %,但是怎么弄都不生效,沒辦法只能看看 mysql 配置文件 mysqld.cnf
里面找到了一項(xiàng)內(nèi)容如下圖:
把上面箭頭所指處注釋后一試,還真是這個(gè),不知道這個(gè)什么時(shí)候設(shè)置的,太無語了。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持。
