python - 不关闭游标会导致内存泄漏吗?

标签 python sql oracle

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

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/

相关文章:

python - 使用 scikit-learn 的一次性编码

python - h5py:存储字符串列表

php - 为什么 PHP 的 oci_connect 不返回 false?

oracle - 如何从可能的编码列表中将 Oracle VARCHAR2 值转换为 UTF-8?

SQL查询可预订房间

python - 有没有办法在 TestCase 之外使用 Python 单元测试断言?

python - 我怎样才能避免出现 OSError : [Errno 9] Bad file descriptor using ibapi?

php - 仅针对特定条件的日期

sql - MySQL的问题!只需要从一行中选择唯一值

MYSQL 子请求太长