標籤:python mysqldb mysql
寫了一個python程式,採用阻塞方式擷取redis隊列資訊,這個隊列資訊可能好幾天才會有新的隊列資訊put到隊列中。在擷取到隊列資訊後,會將擷取到的隊列資訊通過MySQLdb模組寫入MySQL資料庫中。如果長時間沒有隊列中沒有資訊的話,比如1天以上,在1天之後,有隊列資訊抵達redis隊列,並將新的隊列get出來,接著寫入MySQL資料庫時,會報“ MySQL server has gone away”,開始還以為是MySQL有問題,後來發現原來不是。一般這種情況,有的是通過設定“wait_timeout”,將wait_timeout值設定很大,wait_timeout 預設是10.但是我們線上的MySQL的wait_timeout設定為86400,已經是很大了。在stackoverflow.com 上看到一個解析辦法,範例程式碼如下:
import MySQLdbclass DB: conn = None def connect(self): self.conn = MySQLdb.connect() def query(self, sql): try: cursor = self.conn.cursor() cursor.execute(sql) except (AttributeError, MySQLdb.OperationalError): self.connect() cursor = self.conn.cursor() cursor.execute(sql) return cursordb = DB()sql = "SELECT * FROM foo"cur = db.query(sql)# wait a long time for the Mysql connection to timeoutcur = db.query(sql)# still works
大概的意思就是在異常之後,再執行一次select操作,這或許也是一個辦法吧。
我在代碼的也加入了一段類似的功能,在執行真正的SQL操作前,先執行一個SELECT 語句,然後再執行真正的SQL操作。
本文出自 “恒行無忌的部落格” 部落格,轉載請與作者聯絡!
關於" MySQL server has gone away"的問題