oracle DRCP可以与PHP PDO一起使用吗?

时间:2015-08-14 02:24:52

标签: php oracle pdo

我在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的第三方库,我无法弄清楚如何配置它以使用持久连接。 PDO::ATTR_PERSISTENT选项听起来不错,但似乎使用自己的连接缓存(每次都获得一个新连接,并在V$CPOOL_CC_STATS中显示为'miss')。 例如:

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

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

1 个答案:

答案 0 :(得分:0)

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

  由于存在很多问题,带有DRCP的PDO_OCI不是一个可行的解决方案   您正在体验> (PDO想要维护自己的缓存   持久连接。)您可能知道也没有可靠性   网上关于两者作为一个有凝聚力的单位的信息。 --->   (PDO_OCI与DRCP)

     

这背后的原因是因为Oracle Best Practices和   Underground PHP和Oracle Manual指出必须使用PHP OCI8。   它具有更好的功能集,性能,可靠性和稳定性。   建议不要使用PDO_OCI用于通用应用。   另外,您可以通过自己的测试了解DRCP   oci_pconnect(),或者使用带有'persistent'选项的Zend \ Db。

     

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

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