DBUtils手动设置异常的作用

阅读更多

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',
}

你可能感兴趣的:(PostgreSQL,Python,MySQL,Google)