如何检查“我的SQL服务器已断开连接”?
cursor.execute(sql)
File "/usr/lib64/python2.6/site-packages/MySQLdb/cursors.py", line 173, in execute
self.errorhandler(self, exc, value)
File "/usr/lib64/python2.6/site-packages/MySQLdb/connections.py", line 36, in defaulterrorhandler
raise errorclass, errorvalue
_mysql_exceptions.OperationalError: (2006, 'MySQL server has gone away')
我在运行一个无限循环,但每隔30到60分钟就会出现上面的错误。我想在每次循环开始时加一个条件,检查一下MySQL服务器的连接是否还在。如果连接已经断开
,我想在继续下一次循环之前重新建立连接和游标。
我该如何测试服务器是否还在线呢?这样做合适吗?
谢谢!
3 个回答
0
我不能把这个作为评论加到Andrew Johnson的下面,所以我就在这里回答了。
Torndb并不是总能自动重新连接。你经常会看到那个让人头疼的“数据库连接断开了”错误。
处理这个问题的最好办法是为所有的查询写一个函数,然后使用这个函数,确实像其他人建议的那样。另一种方法是给用户发放定时的cookie,如果某个用户在很长时间后请求你的网站,就通过一个包含以下内容的类来处理:
def initialize(self):
db.reconnect()
这样你就可以重新连接数据库,但对于有很多数据库的大型网站来说,这种方法并不太适用。
0
你可以像shshank建议的那样捕捉错误,或者使用一个叫做 torndb 的库,它会自动帮你重新连接。
8
你可以捕捉到操作错误(OperationalError)这个异常,然后重新连接。
from MySQLdb import OperationalError
try:
my_sql_operation()
except OperationalError as e:
#do what you want to do on the error
reconnect()
print e
如果你想在运行查询之前,先检查连接是否断开,可以先执行一个测试查询,看看是否会出现异常。
我不太确定还有哪些情况会引发操作错误。但如果你只想捕捉到 MySQL服务器已断开连接
这个错误,可以这样做。
from MySQLdb import OperationalError
try:
my_sql_operation()
except OperationalError as e:
if 'MySQL server has gone away' in str(e):
#do what you want to do on the error
reconnect()
print e
else:
raise e()
这样做只会捕捉到“断开连接”的错误,而其他原因引发的操作错误则会继续抛出。
更新
正如我在评论中提到的,我的查询函数大概是这样的:
def fetch_data(query):
try:
cursor = conn.Cursor()
cursor.execute(query)
return cursor.fetchall()
except OperationalError as e:
reconnect()
print 'reconnecting and trying again...'
fetch_data(query)
这只是一个例子,可能不适合你的情况。我想表达的意思是,针对不同的事情最好有不同的函数,这样你就能更轻松地处理这些情况。