tornado和Django框架都是使用MySQLdb,在长时间不与数据库有交互,如采集、SQL运行数据过大而数据库等待时间过短等,这时会报“Error 2006: MySQL Server has gone away”错误。收集了网上的三个解决方案是,
一、修改数据库的参数wait_timeout,interactive_timeout到2880000,
二、在每次连接时做判断,如果报错将再连接一次(http://xulizhao.com/blog/python_db)。
class DB: conn = None def connect(self): self.conn = MySQLdb.connect(localhost,root,pass,test) def cursor(self): try: return self.conn.cursor() except (AttributeError, MySQLdb.OperationalError): self.connect() return self.conn.cursor()
三、定时进行连接,以防断开
from tornado.ioloop import PeriodicCallback #torndb.Connection(host, database, user=None, password=None, max_idle_time=25200, connect_timeout=0, time_zone='+0:00') db = torndb.Connection(db_ip, db_database, db_user, db_pass, db_conn_time) # https://github.com/felinx/poweredsites/blob/master/poweredsites/db/mysql.py # ping db periodically to avoid mysql go away PeriodicCallback(db.query(show variables), 3600*4*1000).start()
我的测试,第一种方法比较好用,但是在某些情况下会造成其它问题。第三种效果不理想,需要继续研究。第二种正在试验中。