天天看點

MySQL莫名其妙的斷開連接配接

原因分析

我們進入mysql的指令行查詢逾時時間

show variables like '%timeout%';

MySQL莫名其妙的斷開連接配接

wait_timeout 28800機關是秒轉化成小時就是8小時,看出MySQL的預設設定,當一個連接配接的空閑時間超過8小時後,MySQL就會斷開該連接配接,是以發現問題出在如果超過這個wait_timeout時間(預設是8小時)對資料庫沒有任何操作,那麼MySQL會自動關閉資料庫連接配接以節省資源。

用指令show processlist; 可以檢視Sleep狀态的程序Sleep,同時可以看到每個程序Sleep多久了

MySQL莫名其妙的斷開連接配接

解決方法

1.autoReconnect

這個參數表示在mysql逾時斷開連接配接後會自動重新連接配接

配置的話,隻需要在連接配接mysql的語句寫上autoReconnect=true

url: jdbc:mysql://${MYSQL_HOST:127.0.0.1}:${MYSQL_PORT:6666}/d_20221222?autoReconnect=true&useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&nullCatalogMeansCurrent=true
           

這種方式它有一些副作用

具體介紹下:

  • 原有連接配接上的事務将會被復原,事務的送出模式将會丢失
  • 原有連接配接持有的表的鎖将會全部釋放
  • 原有連接配接關聯的會話Session将會丢失,重新恢複的連接配接關聯的将會是一個新的會話Session
  • 原有連接配接定義的使用者變量将會丢失
  • 原有連接配接定義的預編譯SQL将會丢失
  • 原有連接配接失效,新的連接配接恢複後,MySQL将會使用新的記錄行來存儲連接配接中的性能資料

2.修改配置

涉及到兩個配置參數interactive_timeout和wait_timeout

wait_timeout 指的是mysql在關閉一個非互動的連接配接之前所要等待的秒數

interactive_time 指的是mysql在關閉一個互動的連接配接之前所要等待的秒數

對于互動和非互動連接配接,說得直白一點就是,通過mysql用戶端連接配接資料庫是互動式連接配接,通過jdbc連接配接資料庫是非互動式連接配接。

1.會話方式

配置方法:

set interactive_timeout=28800000;

set wait_timeout=28800000;

這種方式隻對目前會話生效

2.修改配置檔案方式

修改/etc/my.cnf檔案

MySQL莫名其妙的斷開連接配接

之後再重新開機下伺服器就好了

注意:

将wait_timeout這個值設定得大了,可能會導緻空閑連接配接過多。

如果你的MySQL Server有大量的閑置連接配接,他們不僅會白白消耗記憶體,而且如果連接配接一直在累加而不斷開,最終肯定會達到MySQL Server的連接配接上限數,這會報'too many connections'的錯誤。

繼續閱讀