Python实现数据库连接池化
本文测试实践数据库连接池化方法。建立数据库连接是个代价高昂的过程,销毁数据库连接的代价也不小。在实际运用中,可以将预先创建的数据库连接保存在内存中,使用数据库池化技术。
在并发多个sql语句时,要创建多个数据库连接,数据库连接时稀有资源,MySQL的默认max connections是151。数据库池化技术用在避免每执行一个sql语句就创建一个数据库连接,同时限制某个业务的连接数量。
需要注意的是MySQL默认配置的wait_timeout属性确是28800s,也就是8小时,该参数的意义是MySQL在没有进行通信的连接上等待的最长时间直到服务器关闭该连接。所以,数据库连接池化是在一段时间内需要并发执行的需求,而不是长时间一直内存保持数据库连接池。
测试代码托管在:python/mysql_connection_pool.py at main · laufei90/python (github.com)
ConnectionPool类的方法如下:
1、构造函数__init__。根据size确定连接池大小,创建队列queue.Queue,并调用_create_new_conn方法来生成size大小的连接池。
2、创建连接方法_create_new_conn。调用pymysql.connect方法来完成数据库连接。
3、连接入队列方法_put_conn。使用put函数入队列,定义此方法时为了在使用完连接后再放入队列中。
4、连接出队列方法_get_conn。使用get函数出队列,如果连接不存在或中断,会调用_create_new_conn()方法再次打开一个连接。定义此方法时为了再执行sql语句时调用连接池中的连接。
5、执行sql语句方法exec_sql。cursor()的execute函数执行sql语句了。同时根据pymysql.OperationalError来判断数据库连接中断的问题,会调用_create_new_conn()方法打开一个连接。
6、销毁连接池方法__del__。get_nowait()函数非阻塞的从队列中取出元素然后销毁数据库连接。
实例化ConnectionPool类,并完成三个查询,等待30秒来方便在phpmyadmin查看确认以及打开了5个连接,最后删除数据库连接池化。
运行结果如下,查询数据库版本、查询数据库testbt中的表单hosts、查询数据库的PROCESSLIST都成功。PROCESSLIST刨除数据库的5个后台进程外,符合连接池数量size=5的预期。
在phpmyadmin上查看发现有5个连接。