1、现象
在bottle项目中,自己使用mysqldb连接数据库来执行SQL,在程序启动的时候会初始化数据连接,然后全局共享这个连接。
但是在程序运行一段时间后就会出现执行SQL失败的情况,重启后即可恢复。
对应的错误日志如下:
2017-04-09 13:45:25,624|ERROR|MySQL.py|Line:67|Run Select Failed, SQL=
select userid, companyid, role, status from dw_admin_user where username = 'guash' and password = '6F0E9B51C72BA95911638B3971F'
, ResKeys=['userid', 'companyid', 'role', 'status'], Error=(2006, 'MySQL server has gone away')
2、原因
这个项目在晚间没有人访问,长时间没有执行SQL,导致MySQL服务端将连接中断,再次执行SQL时就会出现此错误。
3、解决方案
在执行SQL的动作前加一个ping操作,判断连接是否存在,如果不存在则自动重新连接。
def run_select(self, sql, reskeys):
if not self.connected:
res = self.connect()
if not res:
return None
try:
# ping操作,判断连接是否存在,不存在则自动重新连接
self._mysql.ping(True)
cursor = self._mysql.cursor()
self.logger.info("run select: SQL=\n%s \n, ResKeys=%s, db=%s" % (sql, str(reskeys), self.dbname))
cursor.execute(sql)
rows = cursor.fetchall()
return rows
except Exception as e:
self.logger.error("Run Select Failed, SQL=\n%s \n, ResKeys=%s, Error=%s" % (sql, str(reskeys), e.__str__()))
return None
4、效果
运行两天未出现之前问题,继续观察。
抽空可以研究一下django的源码,因为在django项目中从未出现此类问题。