写了一个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 cursor db = 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操作。
转载于:https://blog.51cto.com/simpledevops/1629722