【问题标题】:cx_Oracle connection poolingcx_Oracle 连接池
【发布时间】:2017-08-22 05:06:07
【问题描述】:

我来自 java 背景,当我在 oracle 中看到用于连接池的 java api 时,oracle 驱动程序本身提供了连接池。但在cx_Oracle 的情况下,我只能看到包含threaded=true 或使用SessionPooling 的选项。

目前我将使用线程 - true 选项。但我不确定使用此选项可以获得多少并发。这是真正的连接池还是有其他方法可以完成此操作。

cx_Oracle 文档说:

“线程参数应该是一个布尔表达式,它指示 Oracle 是否应该使用互斥锁来包装对 连接 的访问。在单线程应用程序中这样做会带来大约 10- 的性能损失15% 这就是为什么默认为 False。”

我们如何配置cx_Oracle 有一个连接池而不是一个会话池。因为两者在 oracle 上都不一样吧?

感谢您的宝贵时间和建议。

【问题讨论】:

    标签: cx-oracle


    【解决方案1】:

    Oracle OCI doc 中有一些关于何时使用连接池和会话池的讨论点。

    对于无状态连接(可以说是更常见的情况),使用会话池:

    • 所有会话池管理都由 OCI 处理。

    • 与运行时负载平衡 (RLB) 事件集成以获得更好的性能。

    • 与 FAN 事件和应用程序连续性集成以提高可用性。

    • 与 DRCP 集成以获得更好的可扩展性。

    【讨论】:

    • @Crhistopher Jones,对于我们只实现 sessionPool,Oracel DB 服务器端必须满足哪些要求?我的数据库似乎有 DRCP innactive for pooling ...这是否意味着通过 cx_oracle 的 SessionPool 将无效?
    • 会话池(通常称为连接池,因为它为应用程序提供连接池)是 cx_Oracle 中的一个池。 DRCP 是数据库中的一个池。它们可以独立使用(但如果您使用 DRCP,我们建议您也使用会话池)。在一些特殊情况下你会使用 DRCP,常见的情况是数据库主机没有足够的内存。您绝对可以使用会话池 - 大多数多用户应用程序都应该使用它。
    【解决方案2】:

    cx_Oracle 不支持连接池,仅支持session pools。如果您计划在应用程序中使用并发并且与会话池的使用无关,则只需使用 threaded=True 选项。您可以使用这种技术获得相当合理的并发性,尤其是当数据库所需的时间远远超过 Python 本身处理数据所需的时间时。

    正如 Chris 所提到的,您也可以在 Python 中“滚动自己的”连接池,没有太大的困难,但是使用内置的会话池功能有很多好处。

    希望能回答您的问题!

    【讨论】:

      猜你喜欢
      • 2020-02-03
      • 1970-01-01
      • 2018-02-14
      • 1970-01-01
      • 2013-08-20
      • 1970-01-01
      • 2015-05-02
      • 1970-01-01
      相关资源
      最近更新 更多