首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在cx_Oracle ORA: DPI-1080:连接被ORA-3113关闭

在cx_Oracle ORA: DPI-1080:连接被ORA-3113关闭
EN

Stack Overflow用户
提问于 2022-03-27 09:48:13
回答 1查看 1.8K关注 0票数 0

我有长时间运行的Python可执行文件。在开始时使用cx_Oracle打开Oracle连接。经过超过45-60分钟的空闲连接-它得到了这个错误。有什么想法或特殊的设置需要在cx_Oracle?

EN

回答 1

Stack Overflow用户

发布于 2022-03-30 20:33:25

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

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

代码语言:javascript
复制
pool = cx_Oracle.SessionPool("username", pw, 
                  "localhost/orclpdb1", min=0, max=4, increment=1)

然后,获得连接,只有在需要时才能保持它:

代码语言:javascript
复制
with pool.acquire() as connection:
    cursor = connection.cursor()
    for result in cursor.execute(
             """select sys_context('userenv','sid') from dual"""):
        print(result)

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

请看我的博客始终使用连接池-以及如何使用连接池,其中大部分都适用于cx_Oracle。

但是,如果不想更改代码,请尝试设置Oracle参数EXPIRE_TIME,如Oracle文档中所示。这可以在不同的地方设置。在基于C的Oracle客户端(如cx_Oracle)中:

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

这可能并不总是有帮助,这取决于关闭连接的内容。

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71635261

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档