内容简介:Python MySQL 数据库连接池组件
引言
pymysqlpool 是数据库 工具 包中新成员,目的是能提供一个实用的数据库连接池中间件,从而避免在应用中频繁地创建和释放数据库连接资源。
功能
- 连接池本身是线程安全的,可在多线程环境下使用,不必担心连接资源被多个线程共享的问题;
- 提供尽可能紧凑的接口用于数据库操作;
- 连接池的管理位于包内完成,客户端可以通过接口获取池中的连接资源(返回
pymysql.Connection); - 将最大程度地与 dataobj 等兼容,便于使用;
- 连接池本身具备动态增加连接数的功能,即
max_pool_size和step_size会用于控制每次增加的连接数和最大连接数; - 连接池最大连接数亦动态增加,需要开启
enable_auto_resize开关,此后当任何一次连接获取超时发生,均记为一次惩罚,并且将max_pool_size扩大一定倍数。
基本工作流程
注意,当多线程同时请求时,若池中没有可用的连接对象,则需要排队等待
- 初始化后优先创建
step_size个连接对象,放在连接池中; - 客户端请求连接对象,连接池会从中挑选最近没使用的连接对象返回(同时会检查连接是否正常);
- 客户端使用连接对象,执行相应操作后,调用接口返回连接对象;
- 连接池回收连接对象,并将其加入池中的队列,供其它请求使用。
|--------| |--------------| | | <==borrow connection object== | Pool manager | | Client | | | | | ==return connection object==> | FIFO queue | |--------| |--------------|
参数配置
- pool_name: 连接池的名称,多种连接参数对应多个不同的连接池对象,多单例模式;
- host: 数据库地址
- user: 数据库服务器用户名
- password: 用户密码
- database: 默认选择的数据库
- port: 数据库服务器的端口
- charset: 字符集,默认为 ‘utf8’
- use_dict_cursor: 使用字典格式或者元组返回数据;
- max_pool_size: 连接池优先最大连接数;
- step_size: 连接池动态增加连接数大小;
- enable_auto_resize: 是否动态扩展连接池,即当超过
max_pool_size时,自动扩展max_pool_size; - pool_resize_boundary: 该配置为连接池最终可以增加的上上限大小,即时扩展也不可超过该值;
- auto_resize_scale: 自动扩展
max_pool_size的增益,默认为 1.5 倍扩展; - wait_timeout: 在排队等候连接对象时,最多等待多久,当超时时连接池尝试自动扩展当前连接数;
- kwargs: 其他配置参数将会在创建连接对象时传递给
pymysql.Connection
使用示例
- 使用
cursor上下文管理器(快捷方式,但每次获取都会申请连接对象,多次调用效率不高):from pymysqlpool import ConnectionPool config = { 'pool_name': 'test', 'host': 'localhost', 'port': 3306, 'user': 'root', 'password': 'root', 'database': 'test' } def connection_pool(): # Return a connection pool instance pool = ConnectionPool(**config) pool.connect() return pool # 直接访问并获取一个 cursor 对象,自动 commit 模式会在这种方式下启用 with connection_pool().cursor() as cursor: print('Truncate table user') cursor.execute('TRUNCATE user') print('Insert one record') result = cursor.execute('INSERT INTO user (name, age) VALUES (%s, %s)', ('Jerry', 20)) print(result, cursor.lastrowid) print('Insert multiple records') users = [(name, age) for name in ['Jacky', 'Mary', 'Micheal'] for age in range(10, 15)] result = cursor.executemany('INSERT INTO user (name, age) VALUES (%s, %s)', users) print(result) print('View items in table user') cursor.execute('SELECT * FROM user') for user in cursor: print(user) print('Update the name of one user in the table') cursor.execute('UPDATE user SET name="Chris", age=29 WHERE id = 16') cursor.execute('SELECT * FROM user ORDER BY id DESC LIMIT 1') print(cursor.fetchone()) print('Delete the last record') cursor.execute('DELETE FROM user WHERE id = 16') - 使用
connection上下文管理器:import pandas as pd from pymysqlpool import ConnectionPool config = { 'pool_name': 'test', 'host': 'localhost', 'port': 3306, 'user': 'root', 'password': 'root', 'database': 'test' } def connection_pool(): # Return a connection pool instance pool = ConnectionPool(**config) pool.connect() return pool with connection_pool().connection() as conn: pd.read_sql('SELECT * FROM user', conn) # 或者 connection = connection_pool().borrow_connection() pd.read_sql('SELECT * FROM user', conn) connection_pool().return_connection(connection) -
更多测试请移步 test_example.py 。
依赖
-
pymysql:将依赖该工具包完成数据库的连接等操作; -
pandas:测试时使用了 pandas。
安装
- 轻移步 pymysqlpool: https://github.com/ChrisLeeGit/pymysqlpool 下载源码,然后使用
pip安装即可:pip3 setup.py install,注意需要使用 Python 3 环境。 - 欢迎反馈,共同学习进步
版权声明
- 本文由Christopher L 发表,采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。请确保你已了解许可协议,并在 转载 时声明。
- 本文固定链接: http://blog.chriscabin.com/?p=1547 。
以上所述就是小编给大家介绍的《Python MySQL 数据库连接池组件》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- EF Core 小坑:DbContextPool 会引起数据库连接池连接耗尽
- 数据库连接池
- 数据库连接池设置
- 怎样获知数据库的连接属性?
- 怎样获知数据库的连接属性?
- Laravel 使用多个数据库连接
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Think Python
Allen B. Downey / O'Reilly Media / 2012-8-23 / GBP 29.99
Think Python is an introduction to Python programming for students with no programming experience. It starts with the most basic concepts of programming, and is carefully designed to define all terms ......一起来看看 《Think Python》 这本书的介绍吧!