【问题标题】:Not closing a cursor can cause memory leaks?不关闭游标会导致内存泄漏?
【发布时间】:2021-12-29 07:55:45
【问题描述】:

我们遇到了一些内存泄漏问题。我认为这应该是因为游标,它永远不会关闭。我正在分享我认为是问题根源的部分。

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

上面的函数将被每个用户调用以检查他们是否已经在数据库中,如果有,则将他们的信息带入数据库,否则将它们插入数据库。所以你可以假设这些函数被频繁调用,一段时间后我们观察到响应时间不断增加,所以我们需要重新启动代码才能再次使用。

目前我对代码本身的访问权限有限,但几天后我将获得修复它的权限,据我从其他来源阅读,我认为这可能是重点,如果我们关闭光标,那么一切都会好起来的,内存泄漏也会得到修复。

我在问你这是否真的是一个问题,或者我错了,浪费我的时间在光标上挣扎。

【问题讨论】:

  • 您有两种可能性:在每次调用中关闭光标或只创建一个光标并在每次调用中重复使用它。在这里,您创建了许多数据库必须处理的连接,但您从不关闭它们,因此它们会不断累积
  • 我就是这么想的。但是,如果我对每个调用都使用全局单个游标并始终保持打开状态,那么它不会导致内存泄漏吗?顺便说一句,谢谢您的回复,当我获得访问权限时,我会尝试并告诉您结果。
  • 不,你不应该对全局游标有任何问题(我不认为这真的是内存泄漏问题,但这只是命名问题)

标签: python sql oracle


【解决方案1】:

你有两种可能:

每次调用时首先关闭光标

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

第二种可能性是获取一个用于所有请求的全局游标

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-06-05
    • 1970-01-01
    • 2019-02-03
    • 2014-05-18
    • 2013-01-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多