9.4 Connector/Python 連線池

支援簡單的連線池,具有以下特性:

  • mysql.connector.pooling 模組實作了連線池。

  • 連線池會開啟多個連線,並在提供連線給請求者時處理執行緒安全。

  • 連線池的大小可以在建立連線池時設定。之後無法調整大小。

  • 連線池可以在建立連線池時命名。如果沒有指定名稱,則會使用連線參數產生一個名稱。

  • 連線池名稱可以從連線池或從連線池取得的連線中檢索。

  • 可以有多個連線池。這使得應用程式可以支援連線到不同 MySQL 伺服器的連線池,例如。

  • 對於每個連線請求,連線池會提供下一個可用的連線。不會使用循環或其他排程演算法。如果連線池耗盡,則會引發 PoolError

  • 可以重新設定連線池使用的連線參數。這些參數適用於之後從連線池取得的連線。不支援透過呼叫連線的 config() 方法來重新設定從連線池取得的個別連線。

可以從連線池功能受益的應用程式包括:

  • 維護與多個 MySQL 伺服器的多個連線,並要求連線隨時可用的中介軟體。

  • 可以開啟更多永久連線到 MySQL 伺服器的網站。

連線池可以隱式或顯式建立。

若要隱式建立連線池:開啟連線並指定一個或多個與連線池相關的引數 (pool_namepool_size)。例如

dbconfig = {
  "database": "test",
  "user":     "joe"
}

cnx = mysql.connector.connect(pool_name = "mypool",
                              pool_size = 3,
                              **dbconfig)

連線池名稱僅限於字母數字字元和特殊字元 ._*$#。連線池名稱的長度不得超過 pooling.CNX_POOL_MAXNAMESIZE 個字元 (預設值為 64)。

連線池大小必須大於 0 且小於或等於 pooling.CNX_POOL_MAXSIZE (預設值為 32)。

pool_namepool_size 引數存在的情況下,Connector/Python 會建立新的連線池。如果未指定 pool_name 引數,則 connect() 呼叫會自動產生名稱,該名稱由提供的 hostportuserdatabase 連線引數依序組成。如果未指定 pool_size 引數,則預設大小為 5 個連線。

後續呼叫 connect() 並命名相同連線池的呼叫會從現有的連線池傳回連線。任何 pool_size 或連線參數引數都會被忽略,因此下列 connect() 呼叫與先前顯示的原始 connect() 呼叫等效

cnx = mysql.connector.connect(pool_name = "mypool", pool_size = 3)
cnx = mysql.connector.connect(pool_name = "mypool", **dbconfig)
cnx = mysql.connector.connect(pool_name = "mypool")

透過呼叫帶有與連線池相關的引數的 connect() 所取得的集區連線具有 PooledMySQLConnection 類別 (請參閱第 10.4 節「pooling.PooledMySQLConnection 類別」)。PooledMySQLConnection 集區連線物件與 MySQLConnection 非集區連線物件類似,但有以下差異:

  • 若要釋放從連線池取得的集區連線,請呼叫其 close() 方法,就像任何非集區連線一樣。但是,對於集區連線,close() 實際上不會關閉連線,而是將其傳回連線池,並使其可供後續連線請求使用。

  • 無法使用集區連線的 config() 方法重新設定集區連線。連線變更必須透過連線池物件本身完成,如稍後所述。

  • 集區連線具有 pool_name 屬性,該屬性會傳回連線池名稱。

若要顯式建立連線池:建立 MySQLConnectionPool 物件 (請參閱第 10.3 節「pooling.MySQLConnectionPool 類別」)

dbconfig = {
  "database": "test",
  "user":     "joe"
}

cnxpool = mysql.connector.pooling.MySQLConnectionPool(pool_name = "mypool",
                                                      pool_size = 3,
                                                      **dbconfig)

若要從連線池請求連線,請使用其 get_connection() 方法

cnx1 = cnxpool.get_connection()
cnx2 = cnxpool.get_connection()

當您顯式建立連線池時,可以使用連線池物件的 set_config() 方法重新設定連線池連線參數

dbconfig = {
  "database": "performance_schema",
  "user":     "admin",
  "password": "password"
}

cnxpool.set_config(**dbconfig)

在組態變更後從連線池請求的連線會使用新的參數。在變更之前取得的連線不受影響,但當它們關閉 (傳回連線池) 時,會使用新參數重新開啟,然後由連線池傳回以供後續連線請求使用。