我在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进行连接,我告诉它使用持久连接......?
答案 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
实现的。