python中的MySQL连接池?

时间:2018-03-25 02:46:03

标签: connection-pooling python-multiprocessing pymysql mysql-connector-python time-wait

我尝试使用Python处理大量数据并在MySQL中维护处理状态。但是,我很惊讶没有python-mysql的标准连接池(比如Java中的HikariCP)。

我最初是从PyMySQL开始的,在程序运行前几个小时之前一切都很棒。几个小时后,事情开始失败。我遇到了很多错误:

pymysql.err.OperationalError: (2003, "Can't connect to MySQL server on '127.0.0.1' ([Errno 99] Cannot assign requested address)")

此外,很多端口都处于TIME_WAIT状态,因为我因为缺少连接池而过于频繁地打开和关闭连接

/d/p/950 ❯❯❯ netstat -nt | wc -l
84752

thisthis,我尝试设置tcp_fin_timeout和ip_local_port_range,但几乎没有任何改进。

echo 30 > /proc/sys/net/ipv4/tcp_fin_timeout
echo 15000 65000 > /proc/sys/net/ipv4/ip_local_port_range

然后我发现MySQL提供了带有pooling功能的mysql.connector。在做完所有这些表现后实际上恶化了。更多流程开始失败。我使用Python的多处理模块在24核机器上同时运行29个进程(多处理.Pool默认选择此项)。以下是代码,当然我使用.my.cnf传递所有凭据以避免将它们提交给git:

    import mysql.connector
    from mysql.connector import pooling
    conn_pool = pooling.MySQLConnectionPool(pool_name="mypool1",
                                              pool_size=pooling.CNX_POOL_MAXSIZE,
                                              option_files=MYSQL_CONFIG,
                                              option_groups=MYSQL_GROUP_NODE1,
                                              allow_local_infile=True)
conn = conn_pool.get_connection()

最后,还原为旧代码。仍在使用PyMySQL,虽然错误较少,但它仍然是一个重大问题。我查看了SQLAlchemy,并没有真正找到关于池的文档。

我想知道其他人如何处理mysql-python连接池问题?我真的相信应该有一些东西,所以我不必重新发明轮子。

非常感谢任何指针。

1 个答案:

答案 0 :(得分:3)

DBUtils实现MySQL(通常声称支持符合DB-API 2标准的数据库接口)用户大小的连接池PooledDB,地址池PersistentDB和{{1} (见functionality section)。后者应该适合您SteadyDB创建具有托管持久数据库连接的工作进程的情况。它被描述为:

  

DBUtils.SteadyDB是一个实现"强化"的模块。基于任何DB-API 2数据库模块的普通连接,与数据库的连接。 A"硬化"当连接关闭或数据库连接丢失或使用频率高于可选使用限制时,连接将在访问时透明地重新打开。

您可以将它与PyMySQL一起使用,如:

multiprocessing.Pool

有关更多示例,请参阅this related question