我尝试使用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
每this和this,我尝试设置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连接池问题?我真的相信应该有一些东西,所以我不必重新发明轮子。
非常感谢任何指针。
答案 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。