python mysql连接池自动关闭的问题_python 使用mysql连接池

本文介绍了Python的DBUtils库,它提供数据库连接池管理,提高高频度高并发数据库访问性能。重点讲解了PersistentDB和PooledDB的区别,以及如何使用PooledDB建立连接池,包括设置连接参数,并展示了连接和关闭数据库的基本操作。此外,还提到了在uwsgi中连接池的配置考虑。
摘要由CSDN通过智能技术生成

环境python2.7

1.DBUtils.PooledDB 介绍

DBUtils 是一套用于管理数据库连接池的包,为高频度高并发的数据库访问提供更好的性能,可以自动管理连接对象的创建和释放。最常用的两个外部接口是 PersistentDB 和 PooledDB,前者提供了单个线程专用的数据库连接池,后者则是进程内所有线程共享的数据库连接池。

DBUtils是一套Python数据库连接池包,并允许对非线程安全的数据库接口进行线程安全包装。DBUtils来自Webware for Python。

DBUtils提供两种外部接口:

PersistentDB :提供线程专用的数据库连接,并自动管理连接。

PooledDB :提供线程间可共享的数据库连接,并自动管理连接。

实测证明 PersistentDB 的速度是最高的,但是在某些特殊情况下,数据库的连接过程可能异常缓慢,而此时的PooledDB则可以提供相对来说平均连接时间比较短的管理方式。

另外,实际使用的数据库驱动也有所依赖,比如SQLite数据库只能使用PersistentDB作连接池。 下载地址:(http://www.webwareforpython.org/downloads/DBUtils/)

2.安装 DBUtils

pip install DBUtils

3.使用案例

import MySQLdb

from DBUtils.PooledDB import PooledDB

pool = PooledDB(MySQLdb,5,host='localhost',user='root',passwd='

很高兴能回答您的问题。关于Python使用MySQL连接池,可以使用第三方库PyMySQL提供的连接池功能,也可以使用Python标准库中concurrent.futures提供的线程池和进程池来实现。 具体操作可以参考以下代码示例: ``` import pymysql from pymysql import cursors from concurrent.futures import ThreadPoolExecutor, as_completed # 创建连接池 class ConnectionPool(object): def __init__(self, size=10): self.__pool = [] for _ in range(size): conn = pymysql.connect(host='localhost', user='root', password='password', database='test', cursorclass=cursors.DictCursor) self.__pool.append(conn) # 获取连接 def get_conn(self): return self.__pool.pop() # 释放连接 def add_conn(self, conn): self.__pool.append(conn) pool = ConnectionPool() # 使用连接池查询数据 def query(sql): conn = pool.get_conn() cursor = conn.cursor() cursor.execute(sql) result = cursor.fetchall() cursor.close() pool.add_conn(conn) return result # 使用线程池并发查询数据 def main(): sqls = ['SELECT * FROM table1;', 'SELECT * FROM table2;', 'SELECT * FROM table3;'] with ThreadPoolExecutor(max_workers=3) as executor: future_to_sql = {executor.submit(query, sql): sql for sql in sqls} for future in as_completed(future_to_sql): sql = future_to_sql[future] try: result = future.result() except Exception as e: print('%s 报错: %s' % (sql, str(e))) else: print('%s 查询结果: %s' % (sql, str(result))) if __name__ == '__main__': main() ``` 以上是使用连接池和线程池来实现MySQL查询操作的示例代码,希望对您有帮助。如果您有其他问题,欢迎继续提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值