9.1 连接器/Python 连接池

支持具有以下特征的简单连接池:

  • mysql.connector.pooling模块实现池化。

  • 在向请求者提供连接时,池会打开多个连接并处理线程安全。

  • 连接池的大小在池创建时是可配置的。此后无法调整大小。

  • 连接池可以在池创建时命名。如果没有给出名称,则使用连接参数生成一个。

  • 可以从连接池或从中获取的连接中检索连接池名称。

  • 可以有多个连接池。例如,这使应用程序能够支持到不同 MySQL 服务器的连接池。

  • 对于每个连接请求,池提供下一个可用连接。不使用循环或其他调度算法。如果池耗尽, PoolError则引发 a。

  • 可以重新配置池使用的连接参数。这些适用于此后从池中获得的连接。config() 不支持 通过调用连接方法重新配置从池中获取的单个连接。

可以受益于连接池功能的应用程序包括:

  • 维护与多个 MySQL 服务器的多个连接并要求连接随时可用的中间件。

  • 可以对 MySQL 服务器打开 更多永久”连接的网站。

可以隐式或显式地创建连接池。

隐式创建连接池:打开连接并指定一个或多个与池相关的参数 (pool_name, pool_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参数,连接器/Python 创建新池。如果pool_name未给出参数,则connect()调用会自动生成名称,该名称由给出的 hostportuserdatabase connection 参数中的任何一个组成,并按该顺序排列。如果 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)

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