python + pymysql连接数据库报“(2003, "Can't connect to MySQL server on 'XXX数据库地址' (timed out)")”
python + pymysql连接数据库报“(2003, "Can't connect to MySQL server on 'XXX数据库地址' (timed out)")”
前言:
由于项目最近更换了数据库,导致执行python代码连接数据库的时候,出现“超时”或“由于连接方在一段时间后没有正确答复或连接的主机没有反应,连接尝试失败。”,代码执行失败了。目前使用的是polardb数据库(类似mysql)
错误信息如下:
1、 数据库连接失败:(2003, "Can't connect to MySQL server on 'XXX数据库的地址' (timed out)") 2、 (2003, "Can't connect to MySQL server on 'XXX数据库的地址' ([WinError 10060] 由于连接方在一段时间后没有正确答复或连接的主机没有反应,连接尝试失败。)")
解决方案:
1、排查了本地端口冲突的问题,连接的远程的服务器
2、和对应的服务器端工作人员排查,机器网络正常(可能网络时好时坏)
3、最后通过加上数据库重连的机制解决
由于是首次遇到这种连接数据库超时的问题,以前连接数据库很少会有这种情况,所以原始代码是不需要重连的,98%概率是成功连接上的
def connect_dbserver(self): """ 连接数据库 """ try: self.db = pymysql.connect(**self.sql_config) self.cursor = self.db.cursor() except pymysql.Error as e: mylog.error("数据库连接失败:{0}".format(e))
加上重连机制的代码,失败了继续重试,一般都可以连接上数据库了
def connect_dbserver(self): """ 连接数据库 """ retry_count = 10 init_connect_count = 0 connect_res = True while connect_res and init_connect_count < retry_count: try: self.db = pymysql.connect(**self.sql_config) self.cursor = self.db.cursor() # 连接上退出循环,连接不上继续重连 connect_res = False except pymysql.Error as e: mylog.info("数据库连接失败,尝试重连...,错误信息:{0}".format(e)) init_connect_count += 1