python中数据库连接池的最佳解决方案是什么?
我已经开发了一些类似于DAO的自定义类,以满足我的项目的一些非常特殊的要求,这是一个不在任何框架内运行的服务器端进程。
该解决方案非常有效,除了每次发出新请求时,我都会通过MySQLdb.connect打开一个新连接。
将其切换为在python中使用连接池的最佳"插入"解决方案是什么?我正在想象类似Java的通用DBCP解决方案。
该过程运行很长时间,并且有许多线程需要发出请求,但并非同时发出请求……特别是在短暂写入大量结果之前,它们做了很多工作。
编辑添加:
经过更多搜索后,我发现anitpool.py看起来不错,但是由于我对python较新,我想我只是想确保我不会错过更明显/更惯用/更好的解决方案。
解决方案
包装连接类。
对我们建立的连接数设置限制。
返回未使用的连接。
截取接近以释放连接。
更新:
我在dbpool.py中输入了以下内容:
import sqlalchemy.pool as pool import MySQLdb as mysql mysql = pool.manage(mysql)
IMO的"更明显/更惯用/更好的解决方案"是使用现有的ORM,而不是发明类似DAO的类。
在我看来,ORM比"原始" SQL连接更受欢迎。为什么?因为Python是OO,所以从SQL行到对象的映射绝对必要。在很多情况下,我们要处理未映射到Python对象的SQL行。
我认为SQLAlchemy或者SQLObject(以及关联的连接池)是更惯用的Pythonic解决方案。
作为独立功能的池化不是很普遍,因为纯SQL(无对象映射)对于受益于连接池的复杂,运行时间长的进程并不普遍。是的,使用了纯SQL,但是它总是在池化无济于事的更简单或者更受控制的应用程序中使用。
我认为我们可能有两种选择:
- 修改类以使用SQLAlchemy或者SQLObject。尽管一开始这似乎很痛苦(浪费了所有工作),但我们应该能够利用所有设计和思想,这只是采用广泛使用的ORM和合并解决方案的一种练习。
- 使用概述的算法滚动自己的简单连接池-循环的简单连接集或者列表。
在MySQL中?
我会说不要打扰连接池。它们通常是麻烦的根源,而对于MySQL,它们并不会带给我们所希望的性能优势。从政治上讲,这条路可能要花很多力气,因为在这个空间中有太多关于连接池的优点的最佳实践,例如挥舞双手和教科书。
连接池只是无网络应用程序的后Web时代(例如HTTP协议)和有状态的长期批处理应用程序的Web之前时代之间的桥梁。由于在Web之前的数据库中连接非常昂贵(因为没有人曾经非常在乎建立连接需要多长时间),因此Web上的应用程序设计了这种连接池方案,以免每次点击都不会产生巨大的处理开销在RDBMS上。
由于MySQL更像是Web时代的RDBMS,因此连接非常轻便且快速。我已经编写了许多大量的Web应用程序,这些应用程序根本不使用MySQL的连接池。
只要没有克服的政治障碍,这就是我们可能会从中受益的一种复杂情况。
我一直在寻找相同的东西。
我找到了pysqlpool和sqlalchemy pool模块