DBUtils 是一套允许线程化 Python 程序可以安全和有效的访问数据库的模块。DBUtils已经作为 Webware for Python 一部分用来结合 PyGreSQL 访问 PostgreSQL 数据库,他也可以用在其他Python应用程序中来访问 DB-API 2 兼容的数据库接口。
我的数据库是postgresql, python的模块用的是psycopg2。一直用的挺好,但是最近发现个问题:postgresql重启后,app server会报InterfaceError异常。我就纳闷鸟,难道DBUtils连接池中的实例没有自动重连数据库功能?? 但是用mysql时,重新启动数据库就没有这个问题。
展开google大法也不得解,没有办法只好扒DButils代码,终于发现问题拉。
我的DBUtils系介样子用滴:
DBPARAMS ={ 'creator': psycopg2, #MySQLdb 'host': 'localhost', 'user': 'postgres', 'password': 'postgres', 'database': 'bob', } pool = PooledDB(maxusage=1000, **DBPARAMS)
用MySQLdb连接mysql时,如果mysql重启了,MySQLdb抛出OperationalError异常,DBUtils抓住后(SteadyDB.py346行),尝试重新连接mysql。很好, 没有问题。
用psycopg2连接postgresql时,如果postgresql重启了,psycopg2第一次抛出OperationalError异常, 之后一直抛InterfaceError异常,DBUtils默认的异常中没有对InterfaceError异常的处理。 完蛋!!
难道只能在DButils的源码中添加?? 见SteadyDB.py239行。
不过还好人家DBUtils早就意识到不同的DB-API2库可能会对数据库异常的处理有所不同,在PooledDB中有个failures参数,在连接postgresql时,手动指定异常InterfaceError即可。
DBPARAMS ={ 'creator': psycopg2, 'failures': (psycopg2.InterfaceError, ) 'host': 'localhost', 'user': 'postgres', 'password': 'postgres', 'database': 'bob', }