php - Oracle 数据库连接总是丢失 DRCP 缓存

标签 php oracle

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

相关文章:

java - 使用oracle webservices代理时出现错误: java. lang.NoClassDefFoundError: org/codehaus/stax2/XMLInputFactory2

sql - 我应该为我单独更新的每个数据库 table.column 编写一个完整的过程吗?

java - 使用 Ibatis 2.3 检索 CLOB 数据

PHPunit 为所有测试套件提供不同的 Bootstrap

php - 如何仅允许 apache 中的 localhost 访问文件夹

php - 为什么要使用 javascript 验证表单?

Java:Oracle XMLType + JDBC

java - Hibernate 连接表

php - 如何组合名称和值的两个数组以在 php 中并排对齐

php - 长时间运行时定期输出到浏览器