Oracle 数据库连接总是错过 DRCP 缓存

我已将 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)


     )


)


慕田峪7331174
浏览 145回答 1
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 是一种池解决方案,因此存在一些开销(以及少量的额外管理)。
打开App,查看更多内容
随时随地看视频慕课网APP