天天看點

Python中 mysql.connector.pooling的8小時逾時問題

背景

工作中一個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()