我不确定这是否可行,但我正在寻找一种在连接丢失时重新连接到 mysql 数据库的方法。所有连接都保存在 gevent 队列中,但我认为这不重要...
我不确定这是否可行,但我正在寻找一种在连接丢失时重新连接到 mysql 数据库的方法。所有连接都保存在 gevent 队列中,但我认为这不重要。我确信如果我花点时间,我可以想出一种重新连接到数据库的方法。然而,我浏览了 pymysql 代码,发现 Connection 类中有一个“ping”方法,我不确定如何使用它。
该方法看起来第一次会重新连接,但之后它又将重新连接标志切换为 False?我可以使用这种方法吗?或者如果丢失连接,是否有其他方法建立连接?即使不是 pymysql,人们如何应对数据库服务器宕机并必须重新建立与 mysql 服务器的连接?
def ping(self, reconnect=True):
''' Check if the server is alive '''
if self.socket is None:
if reconnect:
self._connect()
reconnect = False
else:
raise Error("Already closed")
try:
self._execute_command(COM_PING, "")
return self._read_ok_packet()
except Exception:
if reconnect:
self._connect()
return self.ping(False)
else:
raise
很老了,但我在程序中访问托管数据库时遇到了类似的问题。我最终使用的解决方案是创建一个装饰器,在进行查询时自动重新连接。
给定一个连接函数:
def connect(self):
self.conn = mysql.connector.connect(host=self.host, user=self.user,
database=self.database, password=self.password)
self.cursor = self.conn.cursor()
print("Established connectionn...")
我创建了
def _reconnect(func):
@wraps(func)
def rec(self,*args,**kwargs):
try:
result = func(self,*args,**kwargs)
return result
except (mysql.connector.Error, mysql.connector.Warning) as e:
self.connect()
result = func(self,*args,**kwargs)
return result
return rec
这样任何使用连接的函数现在都可以被修饰成这样
@_reconnect
def check_user_exists(self,user_id):
self.cursor.execute("SELECT COUNT(*) FROM _ where user_id={};".format(user_id))
if self.cursor.fetchall()[0][0]==0:
return False
else:
return True
该装饰器将重新建立连接并重新运行涉及数据库查询的任何功能。