介绍pymysqlpool是数据库工具包的新成员,目的是提供一个实用的数据库连接池中间件,避免应用程序中频繁创建和释放数据库连接资源。函数式连接池本身是线程安全的,可以在多线程环境下使用,不用担心连接资源被多个线程共享;它为数据库操作提供尽可能紧凑的接口;连接池的管理在包中完成,客户端可以通过接口获取池中的连接资源(返回pymysql.Connection);最大程度的兼容dataobj,简单易用;连接池本身具有动态增加连接数的功能,即会通过max_pool_size和step_size来控制每次增加的连接数和最大连接数;连接池的最大连接数也是动态增加的,需要打开enable_auto_resize开关。之后,任何连接获取超时都会被记为惩罚,max_pool_size会扩大一定倍数。基本工作流程注意,当多个线程同时请求时,如果池中没有可用的连接对象,需要排队等待初始化,先创建step_size连接对象,放入连接池中;当客户端请求一个连接对象时,连接池会从中选择最近没有使用过的连接对象并返回(同时会检查连接是否正常);客户端使用连接对象,执行相应操作后,调用接口返回连接对象;连接池回收连接对象并将其添加到池中的队列中以供其他请求使用。|------||------------|||<==borrowconnectionobject==|Poolmanager||Client|||||==returnconnectionobject==>|FIFOqueue||--------||------------|编号配置pool_name:连接池名称,多个连接参数对应多个不同的连接池对象,多单例模式;host:数据库地址user:数据库服务器用户名password:用户密码database:默认选择的databaseport:数据库服务器端口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例1.使用游标上下文管理器(快捷方式,但是每次获取都会申请连接对象,多次调用效率是不高):frompymysqlpoolimportConnectionPoolconfig={'pool_name':'test','host':'localhost','port':3306,'user':'root','password':'root','database':'测试'}defconnection_pool():#Returnaconnectionpoolinstancepool=ConnectionPool(**config)pool.connect()returnpool#直接访问并获取一个cursor对象,这种方式会开启自动提交模式withconnection_pool().cursor()ascursor:print('Truncatetableuser')cursor。execute('TRUNCATEuser')print('Insertonerecord')result=cursor.execute('INSERTINTOuser(name,age)VALUES(%s,%s)',('Jerry',20))print(result,cursor.lastrowid)print('Insertmultiplerecords')users=[(name,age)fornamein['Jacky','Mary','Micheal']forageinrange(10,15)]result=cursor.executemany('INSERTINTOuser(name,age)VALUES(%s,%s)',users)print(result)print('Viewitemsintableuser')cursor.execute('SELECT*FROMuser')foruserincursor:print(user)print('Updatethenameofoneuserinthetable')cursor.execute('UPDATEuserSETname="Chris",age=29WHEREid=16')cursor.execute('SELECT*FROMuserORDERBYidDESCLIMIT1')print(cursor.fetchone())print('Deletethelastrecord')cursor.execute('DELETEFROMuserWHEREid=16')2.使用连接上下文管理器:导入pandasaspdrompymysqlpoolimportConnectionPoolconfig={'pool_name':'test','host':'localhost','port':3306,'user':'root','password':'root','database':'test'}defconnection_pool():#Returnaconnectionpoolinstancepool=ConnectionPool(**config)pool.connect()returnpoolwithconnection_pool().connection()asconn:pd.read_sql('SELECT*FROMuser',conn)#orconnection=connection_pool().borrow_connection()pd.read_sql('SELECT*FROMuser',conn)connection_pool().return_connection(connection)3.更多测试请移步test_example.py依赖1.pymysql:会依赖本工具包完成数据库连接等操作;2.pandas:测试用的是pandas。安装1.移至pymysqlpool:https://github.com/ChrisLeeGit/pymysqlpool下载源码,然后使用pip安装:pip3setup.pyinstall,注意需要使用Python3环境。2.欢迎反馈,共同学习进步
