如何在多个Python SQL脚本中跨文件复用数据库连接池
Python跨脚本复用数据库连接池的实现方案
问题描述
我用Python脚本创建数据库连接执行SQL时,发现创建连接的耗时远超过SQL执行的耗时。因此想创建一个数据库连接池对象,在多个执行SQL的Python脚本中复用它。有没有人有相关实践经验?求具体实现方式。
已尝试操作与报错
连接池创建脚本(dc_connection_pool.py)
import sqlalchemy.pool as pool import jaydebeapi import datetime if __name__ == "__main__": conn = jaydebeapi.connect("<<host>>:<<port>>", {'user': "user-id", 'password': "pw" }, "<<jdbc>>.jar") mypool = pool.QueuePool(conn, max_overflow=10, pool_size=5, reset_on_return=False) while True: continue
其他脚本调用尝试
from dc_connection_pool import mypool
报错信息
NameError: name 'mypool' is not defined
问题原因与解决方法
报错根源
你的mypool是定义在if __name__ == "__main__":代码块内的,这个代码块只有直接运行dc_connection_pool.py时才会执行。当其他脚本导入该模块时,这段初始化代码不会触发,自然找不到mypool变量,导致报错。
另外还有个核心问题:QueuePool的第一个参数应该是创建连接的函数,而不是已经创建好的单个连接。你当前的写法会把同一个连接放进池里,多个请求共用同一连接,完全违背了连接池的设计逻辑。
修正后的连接池实现
修改dc_connection_pool.py,将连接池初始化放在模块级别,并传入创建连接的函数:
import sqlalchemy.pool as pool import jaydebeapi # 定义创建单个数据库连接的函数 def create_db_connection(): return jaydebeapi.connect( "<<host>>:<<port>>", {'user': "user-id", 'password': "pw"}, "<<jdbc>>.jar" ) # 模块级别初始化连接池,导入时自动创建 mypool = pool.QueuePool( create_db_connection, max_overflow=10, # 超出池常驻大小的临时连接上限 pool_size=5, # 池保持的常驻连接数量 reset_on_return=False )
其他脚本复用连接池的方式
现在其他脚本可以直接导入并使用连接池:
from dc_connection_pool import mypool # 获取连接执行SQL示例 with mypool.connect() as conn: cursor = conn.cursor() cursor.execute("SELECT * FROM your_target_table") query_results = cursor.fetchall() # 在这里处理查询结果 cursor.close()
注意事项
- 不要将连接池初始化放在
if __name__ == "__main__"内,否则模块导入时不会执行初始化逻辑。 - 根据数据库类型和JDBC驱动的要求,调整
create_db_connection函数的参数,确保连接能正常创建。 - 根据业务并发量调整
pool_size和max_overflow的值,避免连接数过多导致数据库负载过高。
内容的提问来源于stack exchange,提问作者Praveen Badam
相关产品推荐
相关产品推荐

