我们遇到了一些内存泄漏问题。我想应该是因为游标的原因,游标永远不会关闭。我正在分享我认为是问题根源的部分。
def execute_sql(sql):
logs.custom_formatter(file_name="db", class_name="execute_sql")
try:
mycursor = cnx.cursor()
print("sql:",sql)
mycursor.execute(sql)
result = mycursor.fetchall()
return result
except Exception as e:
print(e)
logs.info("Sql Select Error: {0}".format(e))
return []
还有这个
def commit_sql(sql):
logs.custom_formatter(file_name="db", class_name="commit_sql")
try:
mycursor = cnx.cursor()
mycursor.execute(sql)
cnx.commit()
return True
except Exception as e:
logs.info("Sql Commit Error: {0}".format(e))
return False
上面的函数将被每个用户调用,以检查他们是否已经在数据库中,如果是,则将他们的信息带入数据库,否则将它们插入数据库。因此,您可以假设这些函数被频繁调用,一段时间后我们观察到响应时间持续增加,因此我们需要重新启动代码才能再次使用。
目前我对代码本身的访问权限有限,但几天后我将有权修复它,据我从其他来源阅读,我认为这可能是重点,如果我们关闭光标,那么一切都会好起来的,内存泄漏也会被修复。
我问你这是否真的是一个问题,或者我错了,浪费时间在光标问题上。
最佳答案
你有两种可能性:
首先关闭每次调用的光标
def execute_sql(sql):
logs.custom_formatter(file_name="db", class_name="execute_sql")
mycursor = None
result = []
try:
mycursor = cnx.cursor()
print("sql:",sql)
mycursor.execute(sql)
result = mycursor.fetchall()
except Exception as e:
print(e)
logs.info("Sql Select Error: {0}".format(e))
finally:
try:
mycursor.close()
except:
pass
return result
第二种可能性是只获取一个用于所有请求的全局游标
关于python - 不关闭游标会导致内存泄漏吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70516592/