文章内容
2020/4/14 17:01:45,作 者: 黄兵
MySQL 206相关问题
最近写的一个服务平凡出现错误,主要几个错误内容如下:
MySQLdb._exceptions.OperationalError: (2006, '')
(2006, 'MySQL server has gone away')
出现问题的原因:
长时间连接数据库没有关闭,导致出现问题。
下面是具体代码分析:
# 实例化一个调度器 scheduler = BlockingScheduler() analysis_access_log_main = WriteFile() # 添加任务并设置触发方式为2.5小时执行一次 scheduler.add_job(analysis_access_log_main.start_main, 'interval', seconds=9000) # 开始运行调度器 scheduler.start()
主要看看WriteFile()
函数,具体内容:
class WriteFile: def __init__(self): conn_init = connect_config.Conn_Config() self._mysql_conn = conn_init.Conn_MySQL()
第4行连接了数据库,等待后面操作数据库。
看看连接数据库的具体代码:
@retry(stop_max_attempt_number=10, wait_fixed=2) def Conn_MySQL(self): """连接MySQL数据库 链接失败,重试10次,每次间隔2s""" # 打开数据库连接 db = MySQLdb.connect(host=self.mysql_host, port=self.mysql_port, user=self.mysql_user, passwd=self.mysql_password, db=self.mysql_database, charset=self.charset) return db
这里已经打开了数据库连接,但是我们看到需要等待2.5小时候才具体执行数据库查询,也就是start_main
函数。
def write_access_log_file(self): access_log_file_path = self.access_log_file() time_str = time.strftime("%Y_%m_%d") with closing(self._mysql_conn) as mysql_conn: with closing(mysql_conn.cursor()) as cur: sql = "SELECT * FROM access_log WHERE time>{start_time} AND time
这里with
语句块里调用2.5小时已经连接数据库的代码。
这个时候数据库连接已经等待了2.5小时,继续执行查询的时候,数据库已经关闭。
所以才会出现这个问题。
解决方案:
知道问题出现的原因,也就好解决问题了。
直接将具体连接数据库的代码放到查询函数里,这样就不用等待2.5小时。
修改后的代码:
def write_access_log_file(self): access_log_file_path = self.access_log_file() time_str = time.strftime("%Y_%m_%d") with closing(self.conn_init.Conn_MySQL()) as mysql_conn: with closing(mysql_conn.cursor()) as cur: sql = "SELECT * FROM access_log WHERE time>{start_time} AND time
这里在查询的时候,开始连接数据库。就不会出现问题了。
黄兵个人博客原创。
转载请著名出处:黄兵个人博客 - MySQL 206相关问题
评论列表