gpt4 book ai didi

cx_Oracle 中的 Python 长时间空闲连接获取 : DPI-1080: connection was closed by ORA-3113

转载 作者:行者123 更新时间:2023-12-02 18:15:35 27 4
gpt4 key购买 nike

我正在运行长时间运行的 Python 可执行文件。启动时使用 cx_Oracle 打开 Oracle 连接。空闲连接超过 45-60 分钟后 - 出现此错误。cx_Oracle 中需要任何想法或特殊设置吗?

最佳答案

不要在应用程序中保留未使用的连接,而是考虑在不需要时将其关闭,然后在需要时重新打开。建议使用连接池,因为池可以处理一些潜在的故障(例如您的故障),并为您提供可用的连接。

在应用程序初始化时启动池一次:

pool = cx_Oracle.SessionPool(user="username", password=pw, 
dsn="localhost/orclpdb1", min=0, max=4, increment=1)

然后获取连接并仅在需要时保持它:

with pool.acquire() as connection:
cursor = connection.cursor()
for result in cursor.execute(
"""select sys_context('userenv','sid') from dual"""):
print(result)

with block 的末尾会将连接释放回池中。它不会被关闭。下次调用acquire()时,池可以检查连接仍然可用。如果不是,它会给你一个新的。由于这些检查,即使您只有一个连接,该池也很有用。

查看我的博文Always Use Connection Pools — andHow其中大部分适用于 cx_Oracle。

但是如果您不想更改代码,请尝试设置 Oracle 网络参数 EXPIRE_TIMEcx_Oracle documentation所示和 python-oracledb documentation 。这可以在不同的地方设置。在基于 C 的 Oracle 客户端(例如 cx_Oracle)和 python-oracledb 的厚模式中:

  • 对于 18c 客户端库,可以将其作为 (EXPIRE_TIME=n) 添加到连接描述符的描述部分
  • 借助 19c 客户端库,还可以通过 Easy Connect 使用它:host/service?expire_time=n
  • 通过 21c 客户端库,它还可以在客户端 sqlnet.ora 文件中使用

如果使用 EXPIRE_TIME 来防止防火墙终止空闲连接数,则该值应小于防火墙超时时间的一半。

使用 python-oracledb 的精简模式,您可以在创建连接或池时传递 expire_time 参数,例如:

pool = oracledb.create_pool(user="username", password=pw, 
dsn="dbhost.example.com/orclpdb",
min=0, max=4, increment=1
expire_time=4)

这可能并不总是有帮助,具体取决于关闭连接的原因。

从根本上讲,您应该/可以修复根本原因,这可能是防火墙超时、DBA 强加的用户资源或数据库空闲时间限制。

关于cx_Oracle 中的 Python 长时间空闲连接获取 : DPI-1080: connection was closed by ORA-3113,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71635261/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com