背景
工作中一個Python項目中在連接配接mysql 時使用mysql.connector.pooling,實際使用中發現個别的資料庫一段時間後連接配接全部斷開
沒有任何的預兆和錯誤。後來發現是由于mysql的8小時逾時問題
關于mysql.connector.pooling
以下是我們自己實作的資料連接配接池類中的代碼
···
res["host"] = self._host
res["port"] = self._port
res["user"] = self._user
res["password"] = self._password
res["database"] = self._database
self.dbconfig = res
pool = mysql.connector.pooling.MySQLConnectionPool(
pool_name=pool_name,
pool_size=pool_size,
pool_reset_session=True,
**self.dbconfig)
定位到該問題時是因為在一次調用過程中 報錯說連接配接池已經枯竭,一開始感覺不可思議,
于是定時在mysql伺服器上
mysql -e "show processlist"
發現每天夜裡一定時間連接配接就會消息,觀察時間才直到是因為8小時逾時,因為此連接配接的都是一些查詢任務,
而他們一般是業務背景使用,下班之後導緻連接配接處于sleep狀态太久
問題知道了,更讓我疑惑的是難道python 的這個庫沒有做這件事情?事實情況就是如此,需要我們自己實作
解決的辦法很簡單 就是每次在擷取連接配接的時候判斷目前的連接配接數,不足是就重新建立
size = self.pool._pool_size
qsize = self.pool._cnx_queue.qsize()
if qsize < size:
need_add_size = size - qsize
for x in range(need_add_size):
self.pool.add_connection()