我已将 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)
)
)
最佳答案
问题不在于 SID 的使用(尽管您仍然应该更改它,因为您可能会丢失大量固有功能),而在于您正在使用 oci_connect()
。请改用 oci_pconnect()
。这是一个猜测,因为您错过了提供测试用例。
NUM_HITS
是“找到与池中的池服务器和 session 匹配的客户端请求的总次数。”,但是 oci_connect()
必须重新创建 session ,因此它不会产生“打击”。请参阅 The Underground PHP and Oracle Manual 第 261 页上的表 11其中表示 oci_connect()
“从 DRCP 池中获取池服务器并创建一个全新的 session 。”。您将通过重用共用服务器获得一些好处,但无法获得 oci_pconnect()
所能提供的全部好处。
但是,您应该退后一步,真正回顾一下为什么需要 DRCP。如果您尚未使用 oci_pconnect()
那么您的 PHP 连接调用将会很慢。更改为使用 oci_pconnect()
。然后,您可以减少所需的 Apache 进程数量,从而减少所需的并发连接数量。实现其他最佳实践,例如使用绑定(bind)变量。仅当您的数据库主机没有足够的内存来同时处理所有打开的连接时,您才会转而使用共享服务器或 DRCP。 DRCP 是一个池解决方案,因此存在一些开销(以及少量的额外管理)。
关于php - Oracle 数据库连接总是丢失 DRCP 缓存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59863540/