我编写了一个脚本,根据MySQL数据库中存储的数据向其他用户建议用户。目前我只是做嵌套for循环来迭代两个结果集,这两个结果集都包含每个用户及其所有相关数据,并通过我们的算法比较存储在每个字段中存储的与每对用户的建议相关的值。此脚本目前每分钟在cron选项卡中运行,通常需要大约五到十分钟才能完成。这是因为我们希望尽可能提供最新的建议。目前,当脚本以这种方式运行(隔离运行完全正常)时,会停止抛出错误,从而停止脚本。以下是此错误的堆栈跟踪:
Traceback (most recent call last):
File "/usr/local/lib/python3.5/site- packages/mysql/connector/network.py", line 226, in recv_plain
chunk = self.sock.recv(4 - packet_len)
ConnectionResetError: [Errno 104] Connection reset by peer
有没有办法避免这种情况并仍以这种方式运行脚本?我觉得有了数据库的事务性质,这应该没有问题,即使多次调用脚本正在运行(我知道如果没有对调用量进行上限,则存在内存耗尽的问题) 。如果没有这样做的方法,那么为防止出现这种错误必须满足哪些条件?据我所知,到目前为止,在客户端完成从该连接请求数据之前,在服务器端关闭与数据库的连接时,通常会发生此错误。如果是这样,怎么会避免这种情况?目前,我在几个方法中连接数据库,这些方法在整个脚本中多次调用,创建和销毁与数据库的连接,如下所示:
def queryfunct(sql, args):
cnx = mysql.connector.connect(user='root', password='mypassword', host='localhost', database='mydb')
try:
cursor = cnx.cursor(buffered=True)
cursor.execute(sql, args)
#moar things
...
finally:
cnx.close()
提前感谢您非常感谢。