如果是mysql數據庫的話,數據庫本身有一個超時時間,超過這個時間,數據庫自動就斷開連接
查看數據庫斷開連接時間
show global variables like "%timeout%"
主要看 interactive_timeout 和 wait_timeout 的值。 (interactive_timeout針對交互式連接,wait_timeout針對非交互式連接。所謂的交互式連接,即在mysql_real_connect()函數中使用了CLIENT_INTERACTIVE選項。說得直白一點,通過mysql客戶端連接數據庫是交互式連接,通過jdbc連接數據庫是非交互式連接。 在連接啟動的時候,根據連接的類型,來確認會話變量wait_timeout的值是繼承於全局變量wait_timeout,還是interactive_timeout)
SetMaxOpenConns用於設置最大打開的連接數,默認值為0表示不限制。
SetMaxIdleConns用於設置閑置的連接數。
SetConnMaxLifetime(time.Duration(8*3600) * time.Second) //設置超時時間(不設置就默認永久有效)
這就存在一個問題:如果sqlx連接池長時間沒有連接數據庫,數據庫就會自動斷開,這時候就會導致連接錯誤
[mysql] 2019/12/25 20:04:44 packets.go:36: read tcp 127.0.0.1:60160->127.0.0.1:3
306: wsarecv: An established connection was aborted by the software in your host
machine.
解決辦法2中:
1 在數據庫連接失效之前程序自動連接一次數據庫(不推舉)。
2 設置SetConnMaxLifetime失效時間,和數據庫失效時間保持一致即可 SetConnMaxLifetime(time.Duration(8*3600) * time.Second)