【问题标题】:Python long idle connection in cx_Oracle getting: DPI-1080: connection was closed by ORA-3113cx_Oracle 中的 Python 长空闲连接获取:DPI-1080:连接已被 ORA-3113 关闭
【发布时间】:2022-12-21 13:06:10
【问题描述】:

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

【问题讨论】:

  • 请阐明您的具体问题或提供更多详细信息以准确突出您的需求。正如目前所写的那样,很难准确地说出你在问什么。

标签: python oracle networking cx-oracle


【解决方案1】:

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

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

pool = cx_Oracle.SessionPool("username", pw, 
                  "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 块的末尾会将连接释放回池中。它 不会被关闭。下次调用acquire()时,池可以检查 连接仍然可用。如果不是,它会给你一个新的。由于这些检查,即使只有一个连接,池也很有用。

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

但是,如果您不想更改代码,请尝试设置一个 Oracle 网络参数 EXPIRE_TIME,如 cx_Oracle documentation 中所示。这可以在不同的地方设置。在基于 C 的 Oracle 客户端中,例如 cx_Oracle:

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

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

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

【讨论】:

  • 感谢您的详细回答 - 有见地!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-20
  • 1970-01-01
  • 2021-07-10
  • 2018-07-15
  • 2020-02-09
相关资源
最近更新 更多