можно ли использовать oracle DRCP с PHP 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
).
например:
$pdo = new \PDO('oci:dbname=ORCL_POOL', 'scott', 'tiger',
array(PDO::ATTR_PERSISTENT => true));
Итак, он использует OCI для подключения, и я сказал ему использовать постоянные соединения...?
1 answers
У нас есть соглашение о поддержке с Zend, и я обсудил это с ними. Их ответ, в котором, по их словам, цитируется документация Oracle и "Руководство по подземному PHP и Oracle", был следующим:
PDO_OCI с DRCP не является работоспособным решением из-за тех самых проблем , с которыми вы сталкиваетесь> (PDO хочет поддерживать собственный кэш постоянных подключений.) Как вам, возможно, известно, в Интернете также нет достоверной информации об этих двух как о едином целом. ---> (PDO_OCI (ПДО_СОЦ с DRCP)
Причина этого заключается в том, что в лучших практиках Oracle и руководстве Underground PHP и Oracle говорится, что необходимо использовать PHP OCI8. Он обладает лучшим набором функций, производительностью, надежностью и стабильностью. Использование PDO_OCI для приложений общего назначения "НЕ рекомендуется". Также, как вам известно, с помощью вашего собственного тестирования DRCP можно использовать с oci_pconnect() или с помощью Zend\Db с опцией "постоянный".
Начиная с базы данных Oracle 11g, PHP OCI8 может выполнять объединение соединений в пул с помощью Пула резидентных подключений к базе данных (DRCP).
Однако в качестве обходного пути существует несколько библиотек (таких как https://github.com/taq/pdooci ), которые расширяют базовый класс PDO и реализуют функции с помощью вызовов oci_*. Важно отметить, что для моего варианта использования опция постоянного подключения PDO реализована с oci_pconnect
.