2006柬采,MySQL server has gone away
By default, MySQL-5.0 does not automatically reconnect.
mysql連接如果長時間idle的話,(時間:默認為8小時)废登,會自動斷開,而且不會為原連接自動恢復。
在python中狐树,如果應用程序某個模塊使用了持久化的db鏈接作谚,則失效后狡相,繼續(xù)使用,會報錯: 2006食磕,MySQL server has gone away
解決辦法: 比較ugly
在每次連接之前尽棕,判斷該鏈接是否有效。 MySQLdb提供的接口是 Connection.ping(),
(奇怪彬伦,ping() 這個方法在 MySQLdb 的文檔中居然沒有文檔化, 害我找了好久)
采用 類似:
try:
conn.ping()
except Excption,e: #實際對應的 MySQLdb.OperationalError 這個異常
conn = new conn
的方法解決
為了測試出 ping()的效果滔悉,
我在代碼中先關閉了 conn, 示意如下:
try:
conn.close()
conn.ping()
except Excption,e: #實際對應的 MySQLdb.OperationalError 這個異常
print e
conn = new conn
結果爆出了另外一個錯誤:
InterfaceError: (0, '')
google了一大圈都沒找到正確原因单绑,一度還以為是:
File "/usr/lib/pymodules/python2.6/MySQLdb/cursors.py", line 147, in execute charset = db.character_set_name()
的問題回官, (因為錯誤的traceback 指向了此處...)
實際上: 對任何已經close的conn進行 db相關 操作,包括ping()都會爆出這個錯誤搂橙。
def executeSQL(self,sql=""):
try:
self.conn.ping()
except Exception,e:
self.log.error("Msql出了問題")
self.log.error(str(e))
while True:
try:
self.conn = MySQLdb.connect(self.config.get('mysql_server'),self.config.get('mysql_user'),self.config.get('mysql_pass'),self.config.get('mysql_db_name'),connect_timeout=60,compress=True,charset="UTF8")
break
except Exception,e:
self.log.error("嘗試重連接失敗")
time.sleep(2)
continue
self.cursor=self.conn.cursor()
try:
self.cursor.execute(sql)
self.conn.commit()
return 1
except Exception,e:
self.log.error(str(e))
return 0