执行一个很遥远的python代码报错:

pymysql.err.OperationalError: (2013, 'Lost connection to MySQL server during query (timed out)')

 

先去检查了下,要连接的数据库:

1、连接数没有满,最大连接数8000,现在实际连接数才1500

2、telnet xxxx 3307 几分钟,发现都能通

 

从这里判断了,库没有问题,网络也没有问题,那是问题出在哪里?去一遍遍检查python的数据库部分的代码,发现这块代码如下:

db = pymysql.connect(dbip,dbuser,dbpwd,dbname,charset='utf8mb4',connect_timeout=0.1,read_timeout=0.1)

尝试去掉connect_timeout=0.1,read_timeout=0.1后,再次跑,发现没有报错了。

 

网络上其它的情况案例:

1、数据库服务器有问题,比如hang住,或者网络不通,或者cpu打满,或者连接数满了。

2、无效连接,timeout后,拿到的无效连接

 

还有人分享了一段代码,如果连接无效,就重新创建一个连接:

class DataBase():
    """数据库类"""

    def __init__(self, host='localhost', user='root', pw='password', db='test'):
        self.con = pymysql.connect(host, user, pw, db)
        self.cur = self.con.cursor()

# 方法1:
    def _reCon (self): 
        """ MySQLdb.OperationalError异常"""
        # self.con.close() 
        while True:
            try: 
                self.con.ping()
                break
            except OperationalError:
                self.con.ping(True)

# 方法2:
    def _reConn (self,num=28800,stime=3): 
        """
        校验数据库连接是否异常
        num:8小时
        stime:间隔3秒重连
        """
        _number = 0
        _status = True
        while _status and _number <= num:
            try:
                self.con.ping()         #cping 校验连接是否异常
                _status = False
            except:
                if self.con == True: #重新连接,成功退出
                    _status = False
                    break
                _number +=1
                time.sleep(stime)   #连接不成功,休眠3秒钟,继续循环,直到循环8小时
                
    def insert_visitor_info(self, time, device_id, room_id):
        """插入访客请求信息"""
        self._reCon()
        # self._reConn()
        with self.con:
            sql = "INSERT INTO visitor(time,device_id,room_id) VALUES(%s,%s,%s)"
            self.cur.execute(sql, (time, device_id, room_id))
if __name__ == '__main__':

    db = DataBase()
    db.insert_visitor_info('2019-03-31 17:57:08','8b417cb51268','312')

 

Logo

更多推荐