Робота зі з'єднаннями OCI8 та Connection Pooling
Функції підключення
Модуль OCI8 надає три різні функції для підключення до сервера Oracle. Стандартна функція з'єднання - це oci_connect(). Вона створює з'єднання до бази даних Oracle та повертає ресурс, який використовується при наступних зверненнях до БД.
Підключення до сервера Oracle є досить дорогою операцією з точки зору часу, який потрібний для виконання. Функція oci_pconnect() використовує постійний кеш з'єднань, які можуть бути використані різними запитами скриптів. Це означає, що витрати на встановлення з'єднання, як правило, відбуваються лише один раз на один процес PHP (або нащадка Apache).
Якщо програма з'єднується з сервером Oracle, використовуючи особливий набір даних для кожного веб-користувача, то постійний кеш з'єднань, що використовується функцією oci_pconnect() буде менш корисним, т.к. кількість одночасних користувачів зростає до того рівня, де він може почати негативно впливати на загальну продуктивність сервера Oracle через підтримку занадто великої кількості з'єднань, що простоюють. Якщо програма налаштована таким чином, рекомендується або налаштувати її за допомогою параметрів конфігурації oci8.max_persistent і oci8.persistent_timeout (це дасть можливість керування розміром кешу постійних з'єднань та їх час життя), або використовувати Oracle Database Resident Connection Pooling (в Oracle Database 11g і новіше), або використовувати функцію oci_connect() замість неї.
Вместеoci_connect() і oci_pconnect() використовують кеш підключень; якщо безліч викликів oci_connect() використовує однакові параметри в даному скрипті, другий та наступні виклики повернуть існуючий дескриптор з'єднання. Кеш, який використовується функцією oci_connect(), очищається після завершення виконання скрипта, або коли з'єднання неявно закривається. У функції oci_pconnect() подібна поведінка, хоча її кеш обробляється окремо і залишається чинною між запитами HTTP.
Ця можливість кешування означає, що два дескриптори не ізольовані транзакційно (вони насправді є одним і тим самим дескриптором, тому тут немає ізоляції). Якщо додатку потрібні дві окремі транзакційно ізольовані сполуки, то необхідно використовувати функцію oci_new_connect()
Кеш функцииoci_pconnect() очищується та закриваються всі з'єднання до БД, коли завершується процес PHP. Тому ефективне використання постійних з'єднань вимагає, щоб PHP був модулем Apache або використовувався з FPM або подібним. Постійні з'єднання не матимуть жодних переваг перед oci_connect()коли PHP використовується з CGI або через командний рядок.
Функцияoci_new_connect() завжди створює нове з'єднання з сервером Oracle, незважаючи на те, що інші з'єднання можуть існувати. Високонавантаженим веб-додаткам слід уникати використання oci_new_connect(), особливо в найбільш завантажених частинах програми.
Постійні з'єднання можуть бути закриті користувачем, що дає повніший контроль над використанням ресурсів. Також постійні з'єднання можуть бути закриті автоматично, якщо не залишилося змінних PHP, що вказують на них, наприклад при завершенні виконання функції користувача. Закриття з'єднання відкотить усі підтверджені транзакції. Ці зміни в постійних підключеннях роблять їхню поведінку аналогічною не постійним з'єднанням. Щоб увімкнути стару поведінку, задайте опцію oci8.old_oci_close_semanticsзначениемOn
Автоматичне перестворення постійних з'єднань після перезапуску процесів Apache або FPM означає, що Oracle Database LOGON
рекомендується лише для налаштування атрибутів сеансу, а не для запитів на підключення користувачів для окремих програм.
Створення пулу з'єднань DRCP
PHP підтримує постійний пул з'єднань Oracle 11g (DRCP). DRCP дозволяє більш ефективно використовувати пам'ять СУБД та надає високу масштабованість. Змінювати код програми для використання DRCP або немає потреби, або потрібні мінімальні зміни.
DRCP підходить для додатків, які підключаються використовуючи кілька схем БД та зберігають з'єднання до БД відкритими короткий проміжок часу. Іншим програмам слід використовувати доступні за замовчуванням Dedicated
серверні процеси або використовувати Shared
сервера.
DRCP приносить користь усім трьом функціям підключення, проте надає найвищу масштабованість, коли з'єднання створюються за допомогою функції oci_pconnect()
Щоб функціональність DRCP була доступна в OCI8, клієнтські бібліотеки Oracle, які використовуються в PHP, і версія сервера баз даних повинні бути 11g і новішими.
Документація з DRCP знаходиться в кількох посібниках Oracle. Наприклад, дивіться »Конфігурування пулу постійних з'єднань бази данихв документации Oracle для информации по использованию. Документ» технічний опис DRCPсодержит дополнительную информацию по DRCP.
Для використання DRCP встановіть модуль OCI8 та бібліотеки Oracle 11g (або новіший) і виконайте такі дії:
-
Як привілейований адміністратор БД скористайтеся програмою на кшталт SQL*Plus, щоб запустити пул з'єднань у СУБД:
SQL> execute dbms_connection_pool.start_pool;
-
Додатково можна використовувати
dbms_connection_pool.alter_param()
, щоб налаштувати параметри DRPC. Поточні налаштування пулу можуть бути отримані з поданняDBA_CPOOL_INFO
-
Оновіть рядок з'єднання. Наприклад, для програм PHP, які зараз з'єднуються, використовуючи Network Connect Name
MYDB
:$c = oci_pconnect("myuser", "mypassword", "MYDB");
змініть файл tnsnames.ora та додайте оператор
(SERVER=POOLED)
, наПриклад:MYDB = (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp) (HOST=myhost.dom.com) (PORT=1521))(CONNECT_DATA=(SERVICE_NAME=sales) (SERVER=POOLED)))
Як альтернативу можна змінити синтаксис спрощеного з'єднання в PHP і додати туди
:POOLED
після імені сервісу:$c = oci_pconnect("myuser", "mypassword", "myhost.dom.com:1521/sales:POOLED");
-
Відредагуйте php.ini та виберіть ім'я класу з'єднання. Це ім'я встановлює логічний поділ пулу з'єднань і може використовуватися, щоб ізолювати пул для окремих додатків. Будь-яка PHP-додаток з однаковим ім'ям користувача та класом для з'єднання буде мати можливість спільно використовувати з'єднання в пулі, отримуючи більшу масштабованість.
oci8.connection_class = "MY_APPLICATION_NAME"
-
Запустіть програму, що з'єднується з базою 11g та новішою.
Зауваження :
Програми, що використовують Oracle 10g, які потребують продуктивності від постійних з'єднань, можуть зменшити кількість пам'яті сервера БД, яка використовується
Shared
-серверами Oracle (раніше відомі як багатопотокові сервери). Для отримання докладнішої інформації зверніться до документації Oracle.
Зауваження :
При зміні пароля через з'єднання DRCP буде видаватися помилка ORA-56609: Usage not supported with DRCP. Це документоване обмеження Oracle Database 11g.