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)

配置更改后从池请求的连接将使用新参数。更改之前获取的连接不受影响,但是当它们关闭(返回到池)时,将在返回到池以供后续连接请求之前使用新参数重新打开。