【问题标题】:Oracle Database connections always miss the DRCP cacheOracle 数据库连接总是错过 DRCP 缓存
【发布时间】:2020-01-27 11:23:22
【问题描述】:

我已将 Oracle 配置为使用 DRCP 并设置 PHP 以连接到池连接,但是当我拉取连接统计信息时,命中率始终为零,而请求数和未命中数继续攀升。

CCLASS_NAME             NUM_REQUESTS NUM_HITS NUM_MISSES NUM_WAITS  WAIT_TIME CLIENT_REQ_TIMEOUTS   
BIGTUNACAN.drcp_pooling_test    9828        0       9828         6     0     0

我在 tnsnames.ora 中的连接使用的是 SERVER = POOLED 并且我的 php.ini 设置了 drcp_pooling_test。

我现在不知道为什么永远不会使用缓存的连接。

TNS 条目如下

TESTPOOL.WORLD =

   (DESCRIPTION =

     (ADDRESS_LIST =

       (ADDRESS = (PROTOCOL = TCP)(HOST = test-db.bigtunacan.com)(PORT = 1521))

     )

     (CONNECT_DATA =

       (SID = TEST)

       (SERVER = POOLED)

     )

)

【问题讨论】:

  • 你能发布整个 tns 条目吗?您是否连接到服务? (如果是这样,据我所知,DRCP 不适用于默认服务。)
  • @JonHeller 我已经添加了 tns 条目,只是替换了主机。我们使用的是 SID 而不是服务名称。
  • (SID=TEST) 可能是您的问题。您需要连接到服务,而不是 sid
  • @ConnorMcDonald 是否有一些 Oracle 文档对此进行了描述?我不反对;我只需要向 DBA 展示一些具体的东西。
  • 不确定 - 我已经几十年没有使用过 SID(其他人也不应该使用)。早在 8i 中,服务就成为了推荐。如果没有看到您完成的整个 DRCP 设置,我们无法发表评论

标签: php oracle


【解决方案1】:

问题不在于 SID 的使用(尽管您仍然应该更改它,因为您可能会丢失一堆固有功能),而是您使用的是 oci_connect()。请改用oci_pconnect()。这是一个猜测,因为您错过了提供测试用例。

NUM_HITS 是“客户端请求在池中找到匹配的池化服务器和会话的总次数。”,但oci_connect() 必须重新创建会话,因此它不会“命中”。请参阅The Underground PHP and Oracle Manual 的第 261 页上的表 11,其中说 oci_connect()“从 DRCP 池中获取一个池化服务器并创建一个全新的会话。”。重用池服务器会为您带来一些好处,但oci_pconnect() 无法为您带来全部好处。

但是,您应该退后一步,真正回顾一下您为什么需要 DRCP。如果您还没有使用oci_pconnect(),那么您的 PHP 连接调用会很慢。改为使用oci_pconnect()。然后,您可以减少所需的 Apache 进程数,这将减少所需的并发连接数。实施其他最佳实践,例如使用绑定变量。只有当您的数据库主机没有足够的内存来同时处理所有打开的连接时,您才会转而使用共享服务器或 DRCP。 DRCP 是一种池解决方案,因此存在一些开销(以及少量的额外管理)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-01-07
    • 1970-01-01
    • 1970-01-01
    • 2013-10-21
    • 2018-06-20
    • 1970-01-01
    • 1970-01-01
    • 2020-10-12
    相关资源
    最近更新 更多