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',
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值