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



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

$conn = oci_pconnect('scott', 'tiger', 'ORCL_POOL');
或者,我可以使用ZendDb:
$db = new ZendDbAdapterAdapter(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中显示为"错过")。如:

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

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

我们与Zend有支持协议,我向他们提出了这个问题。他们引用了Oracle文档和"The Underground PHP and Oracle Manual",回复是:

由于这些问题,带有DRCP的PDO_OCI不是一个可行的解决方案(PDO想要维护自己的缓存持久连接)。如你所知,也没有可靠的网络上的信息将两者视为一个有凝聚力的单位。--->(PDO_OCI with DRCP)

这背后的原因是因为Oracle最佳实践和地下PHP和Oracle手册,说明必须使用PHP OCI8。它有更好的特性集、性能、可靠性和稳定性。不建议将PDO_OCI用于一般用途的应用程序。此外,正如您通过自己的测试所知道的,DRCP可以与oci_pconnect(),或使用带有'persistent'选项的ZendDb。

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

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

最新更新