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',
}
推荐阅读
-
ios8 UITableView设置 setSeparatorInset UIEdgeInsetsZero不起作用的解决办法(去掉15px空白间距)
-
C# 网络连接中异常断线的处理:ReceiveTimeout, SendTimeout 及 KeepAliveValues(设置心跳)
-
为什么160WiFi会提示”请重新开启或手动设置共享”的原因和解决办法
-
JS异常处理try..catch语句的作用和实例
-
cad图形界限怎么设置? cad图形界限的作用
-
实例讲解站内站外软文中锚文本的设置及作用
-
使用layer.msg 时间设置不起作用的解决方法
-
python爬虫之urllib,伪装,超时设置,异常处理的方法
-
mybatis 使用jdbc.properties文件设置不起作用的解决方法
-
ios8 UITableView设置 setSeparatorInset UIEdgeInsetsZero不起作用的解决办法(去掉15px空白间距)