【问题标题】:can oracle DRCP be used with PHP PDO?oracle DRCP 可以与 PHP PDO 一起使用吗?
【发布时间】:2015-11-07 04:41:33
【问题描述】:

我在 oracle 数据库中设置了数据库驻留连接池。 配置完成后,我可以使用几种方法从池中获取持久连接:

$conn = oci_pconnect('scott', 'tiger', 'ORCL_POOL');

或者,我可以使用 Zend\Db:

$db = new \Zend\Db\Adapter\Adapter(array(
    'persistent' => true,
    'username' => 'scott',
    'password' => 'tiger',
    'driver' => 'oci8',
    'instance' => 'ORCL_POOL', //configured in tnsnames with (SERVER=POOLED)
));

到目前为止一切顺利,我可以看到连接正在通过 oracle 视图(例如 V$CPOOL_CC_STATS)从池中重用

我有一个使用 PDO 的第 3 方库,但我不知道如何配置它以使用持久连接。 PDO::ATTR_PERSISTENT 选项听起来不错,但似乎使用了自己的连接缓存(每次都会获得一个新连接,并在V$CPOOL_CC_STATS 中显示为“未命中”)。 例如:

$pdo = new \PDO('oci:dbname=ORCL_POOL', 'scott', 'tiger', 
                array(PDO::ATTR_PERSISTENT => true));

所以它使用 OCI 进行连接,我已经告诉它使用持久连接...?

【问题讨论】:

  • 我不明白你的问题。

标签: php oracle pdo


【解决方案1】:

我们与 Zend 签订了支持协议,我向他们提出了这个问题。他们引用 Oracle 文档和“The Underground PHP and Oracle Manual”的回答是:

使用 DRCP 的 PDO_OCI 不是一个可行的解决方案,因为问题很严重 您正在经历 >(PDO 想要维护自己的缓存 持久连接。)您可能知道,也没有可靠的 网络上关于这两者作为一个有凝聚力的单元的信息。 ---> (带有 DRCP 的 PDO_OCI)

这背后的原因是因为 Oracle 最佳实践和 Underground PHP and Oracle Manual,声明必须使用 PHP OCI8。 它具有更好的功能集、性能、可靠性和稳定性。 建议“不”将 PDO_OCI 用于通用应用程序。 此外,正如您通过自己的测试所知道的,DRCP 可以与 oci_pconnect(),或者使用 Zend\Db 和 'persistent' 选项。

从Oracle Database 11g开始,PHP OCI8可以做连接池 使用数据库驻留连接池 (DRCP)。

但是,作为一种解决方法,周围有一些库(例如https://github.com/taq/pdooci)扩展基本 PDO 类并通过 oci_* 调用实现这些功能。对于我的用例而言,重要的是,PDO 的持久连接选项是通过 oci_pconnect 实现的。

【讨论】:

  • 真正的原因是 PDO_OCI 不使用 Oracle 的“会话池”,它是与 DRCP 服务器对话的技术。 PHP OCI8 确实在内部使用会话池。
猜你喜欢
  • 2012-08-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-10
  • 1970-01-01
  • 2015-08-30
相关资源
最近更新 更多