【问题标题】:Get access to SQLAlchemy connection socket to prevent firewall timeouts访问 SQLAlchemy 连接套接字以防止防火墙超时
【发布时间】:2021-06-28 18:37:49
【问题描述】:

我的数据库连接有一些问题。它们似乎被网络中的某些防火墙突然切断,而在 TCP 级别解决此问题的一个好方法似乎是为特定的 TCP 套接字配置 keepalive。问题是我不知道如何以及是否可以访问由 SQLAlchemy 管理的连接。我正在使用它连接到 Oracle 数据库。这是通过使用 cx_Oracle 和 Oracle 的 Instant Client 来实现的。

【问题讨论】:

    标签: python-3.x oracle sqlalchemy cx-oracle


    【解决方案1】:

    使用cx_Oracle doc 中记录的SQL*Net 选项EXPIRE_TIMEEXPIRE_TIME 可用于防止防火墙终止空闲连接并调整保活超时。 EXPIRE_TIME 的一般建议是使用略小于终止期一半的值。

    详情:

    • 使用 18c 客户端库,它可以作为 (EXPIRE_TIME=n) 添加到连接描述符的 DESCRIPTION 部分(在应用程序中的完整连接描述符字符串中,或​​在 tnsnames.ora 文件中)。
    • 借助 19c 客户端库,它可以通过 Easy Connect 使用:host/service?expire_time=n
    • 使用 21c 客户端库,它可以在客户端(即 Python 机器)sqlnet.ora 中使用。

    对于较旧的客户端版本,您可以改用ENABLE=BROKEN

    还可以考虑在 SQLAlchemy 中使用connection pool,因为这将进行一些检查并在连接被终止时自动重新建立连接。池也非常适合在大量使用、长时间运行的应用中提高性能。

    【讨论】:

    • 我已经有一个 sqlnet.ora 文件,我之前使用 v 21 运行的测试似乎解决了这个问题。但是,我现在使用的是 19.10 版本的即时客户端,并且由于某种原因它似乎忽略了我的 sqlnet.ora SQLNET.EXPIRE_TIME=1 配置。我想尝试通过 Easy Connect 机制按照您的建议传递它,但是,将它附加到连接字符串会导致如下结果:oracle+cx_oracle_no_clobs://user:pass@host:port/dbname? expire_time=1,这会导致 dbapi.connect 抛出错误:TypeError: 'expire_time' is an invalid kw arg for this fn.
    • P.S 上面的连接字符串是由 SQLAlchemy 使用的
    • 'Some reason' 是在 21c 之前的(客户端)sqlnet.ora 中不支持它 - 正如我上面列出的那样。自己创建一个 tnsnames.ora 文件并在 SQLAlchemy 中引用连接别名。
    • 只是为了确认......没有办法在 tsnames 中为用户可能决定在应用程序级别使用的任何主机、端口和 SID 全局启用 keepalive 行为,对吧?
    • 使用 21c 客户端并在 sqlnet.ora 文件中使用 EXPIRE_TIME。
    猜你喜欢
    • 1970-01-01
    • 2013-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多