Files
php-doc-ru/reference/oci8/connection.xml
2024-05-13 00:12:13 +03:00

261 lines
15 KiB
XML
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?xml version="1.0" encoding="utf-8"?>
<!-- EN-Revision: 5e41012cfdf8f2eff5fa56de446c7656afac536c Maintainer: rjhdby Status: ready -->
<!-- Reviewed: no -->
<chapter xml:id="oci8.connection" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink">
<title>Работа с соединениями OCI8 и Connection Pooling</title>
<section>
<title>Функции подключения</title>
<para>
Модуль OCI8 предоставляет три различных функции для подключения
к серверу Oracle. Стандартная функция соединения —
<function>oci_connect</function>. Она создаёт соединение к базе данных
Oracle и возвращает ресурс, который используется при последующих обращениях
к БД.
</para>
<para>
Подключение к серверу Oracle является достаточно дорогостоящей операцией
с точки зрения времени, которое требуется для выполнения.
Функция <function>oci_pconnect</function> использует постоянный
кеш соединений, которые могут быть повторно использованы различными
запросами скриптов. Это означает, что затраты на установку соединения,
как правило, происходят только единожды на один процесс PHP
(или на потомка Apache).
</para>
<para>
Если приложение соединяется к серверу Oracle, используя особый набор
данных для каждого веб-пользователя, то постоянный кеш соединений,
используемый функцией <function>oci_pconnect</function> будет менее
полезным, поскольку количество одновременных пользователей вырастает до
того уровня, где он может начать оказывать негативное влияние на
общую производительность сервера Oracle из-за поддержания слишком
большого количества простаивающих соединений. Если приложение
настроено таким образом, то рекомендуется либо настроить его с
помощью параметров конфигурации
<link linkend="ini.oci8.max-persistent">oci8.max_persistent</link>
и <link linkend="ini.oci8.persistent-timeout">oci8.persistent_timeout</link>
(это даст возможность управления размером кеша постоянных соединений и
их время жизни), либо использовать Oracle Database
Resident Connection Pooling (в Oracle Database 11g и новее), либо использовать функцию
<function>oci_connect</function> вместо неё.
</para>
<para>
Вместе <function>oci_connect</function>
и <function>oci_pconnect</function> используют кеш подключений; если
множество вызовов <function>oci_connect</function> использует одинаковые
параметры в данном скрипте, второй и последующие вызовы вернут
существующий дескриптор соединения. Кеш, который использует функция
<function>oci_connect</function>, очищается по завершению выполнения
скрипта, или когда соединение неявно закрывается. У функции
<function>oci_pconnect</function> похожее поведение, хотя её кеш
обрабатывается отдельно и остаётся действующим между
HTTP-запросами.
</para>
<para>
Эта возможность кеширования означает, что два дескриптора не изолированы
транзакционно (они на самом деле являются одним и тем же дескриптором, поэтому здесь
нет никакой изоляции). Если приложению необходимы два отдельных
транзакционно изолированных соединения, то необходимо использовать
функцию <function>oci_new_connect</function>.
</para>
<para>
Кеш функции <function>oci_pconnect</function> очищается и закрываются
все соединения к БД, когда завершается процесс PHP. Поэтому
эффективное использование постоянных соединений требует, чтобы PHP был
модулем Apache или использовался с FPM или подобным. Постоянные соединения
не будут иметь никаких преимуществ перед <function>oci_connect</function>,
когда PHP используется с CGI или через командную строку.
</para>
<para>
Функция <function>oci_new_connect</function> каждый раз создаёт
новое соединение с сервером Oracle, несмотря на то, что другие
соединения могут уже существовать. Высоконагруженным веб-приложениям
следует избегать использования <function>oci_new_connect</function>, особенно
в самых загруженных частях приложения.
</para>
<para>
Постоянные соединения могут быть закрыты пользователем, что
даёт более полный контроль над использованием ресурсов. Также постоянные соединения могут
быть закрыты автоматически, если не осталось переменных PHP указывающих на них,
например при завершении выполнения пользовательской функции. Закрытие соединения
откатит все не подтверждённые транзакции. Эти изменения в постоянных подключениях
делают их поведение аналогичным не постоянным соединениям. Чтобы включить старое
поведение, задайте опцию <link linkend="ini.oci8.old-oci-close-semantics">oci8.old_oci_close_semantics</link> значением
<emphasis>On</emphasis>.
</para>
<para>
Автоматическое пересоздание постоянных соединений после перезапуска процессов
Apache или FPM, означает, что Oracle Database <literal>LOGON</literal>
рекомендуется только для настройки атрибутов сеанса, а не для запросов
на подключение пользователей для отдельных приложений.
</para>
</section>
<section>
<title>Создание пула соединений DRCP</title>
<para>
PHP поддерживает постоянный пул соединений Oracle 11g
(DRCP). DRCP позволяет более эффективно использовать память СУБД и предоставляет
высокую масштабируемость. Изменять код приложения для использования DRCP либо
нет необходимости, либо требуются минимальные изменения.
</para>
<para>
DRCP подходит для приложений, которые подключаются используя несколько
схем БД и сохраняют соединения к БД открытыми короткий промежуток времени.
Другим приложениям следует использовать доступные по умолчанию
<literal>Dedicated</literal> серверные процессы или
использовать <literal>Shared</literal> сервера.
</para>
<para>
DRCP приносит пользу всем трём функциям подключения, однако предоставляет
самую высокую масштабируемость, когда соединения создаются с
помощью функции <function>oci_pconnect</function>.
</para>
<para>
Чтобы функциональность DRCP была доступна в OCI8, клиентские библиотеки Oracle, используемые в
PHP, и версия сервера баз данных должны быть 11g и новее.
</para>
<para>
Документация по DRCP находится в нескольких руководствах Oracle. К примеру,
смотрите <link xlink:href="&url.oracle.drcp.configure;">Конфигурирование
пула постоянных соединений базы данных</link> в документации Oracle
для информации по использованию.
Документ <link xlink:href="&url.oracle.drcp.whitepaper;">техническое
описание DRCP</link> содержит дополнительную информацию по DRCP.
</para>
<para>
Для использования DRCP, установите модуль OCI8
и библиотеки Oracle 11g (или новее) и затем выполните следующие действия:
</para>
<para>
<itemizedlist>
<listitem>
<para>
Как привилегированный администратор БД воспользуйтесь программой
наподобие SQL*Plus, чтобы запустить пул соединений в СУБД:
</para>
<para>
<informalexample>
<screen>
<![CDATA[
SQL> execute dbms_connection_pool.start_pool;
]]>
</screen>
</informalexample>
</para>
</listitem>
<listitem>
<para>
Дополнительно можно использовать
<literal>dbms_connection_pool.alter_param()</literal>,
чтобы конфигурировать параметры DRPC. Текущие настройки пула могут быть
получены из представления <literal>DBA_CPOOL_INFO</literal>.
</para>
</listitem>
<listitem>
<para>
Обновите используемую строку соединения. К примеру, для приложений PHP, которые
сейчас соединяются, используя Network Connect Name
<literal>MYDB</literal>:
</para>
<para>
<informalexample>
<screen>
<![CDATA[
$c = oci_pconnect("myuser", "mypassword", "MYDB");
]]>
</screen>
</informalexample>
</para>
<para>
измените файл tnsnames.ora и добавьте
оператор <literal>(SERVER=POOLED)</literal>, например:
</para>
<para>
<informalexample>
<screen>
<![CDATA[
MYDB = (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp) (HOST=myhost.dom.com)
(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=sales)
(SERVER=POOLED)))
]]>
</screen>
</informalexample>
</para>
<para>
В качестве альтернативы можно изменить синтаксис упрощённого соединения
в PHP и добавить туда <literal>:POOLED</literal> после имени сервиса:
</para>
<para>
<informalexample>
<screen>
<![CDATA[
$c = oci_pconnect("myuser", "mypassword", "myhost.dom.com:1521/sales:POOLED");
]]>
</screen>
</informalexample>
</para>
</listitem>
<listitem>
<para>
Отредактируйте &php.ini; и выберите имя класса соединения. Это имя
устанавливает логическое разделение пула соединений и может использоваться,
чтобы изолировать пул для отдельных приложений. Любое PHP-приложение
с одинаковым именем пользователя и классом для соединения
будет иметь возможность совместно использовать соединения в пуле, получая
бОльшую масштабируемость.
</para>
<para>
<informalexample>
<screen>
<![CDATA[
oci8.connection_class = "MY_APPLICATION_NAME"
]]>
</screen>
</informalexample>
</para>
</listitem>
<listitem>
<para>
Запустите приложение, соединяющееся с базой 11g и новее.
</para>
</listitem>
</itemizedlist>
</para>
<note>
<para>
Приложения, использующие Oracle 10g, которые требуют производительности
от постоянных соединений, могут уменьшить количество памяти сервера БД,
которое используется <literal>Shared</literal>-серверами Oracle
(ранее известные как многопоточные сервера). Обратитесь к документации
Oracle для более подробной информации.
</para>
</note>
<note>
<para>
При изменении пароля через DRCP-соединение будет выдаваться
ошибка <emphasis>ORA-56609: Usage not supported with DRCP</emphasis>.
Это документированное ограничение of Oracle Database 11g.
</para>
</note>
</section>
</chapter>
<!-- Keep this comment at the end of the file
Local variables:
mode: sgml
sgml-omittag:t
sgml-shorttag:t
sgml-minimize-attributes:nil
sgml-always-quote-attributes:t
sgml-indent-step:1
sgml-indent-data:t
indent-tabs-mode:nil
sgml-parent-document:nil
sgml-default-dtd-file:"~/.phpdoc/manual.ced"
sgml-exposed-tags:nil
sgml-local-catalogs:nil
sgml-local-ecat-files:nil
End:
vim600: syn=xml fen fdm=syntax fdl=2 si
vim: et tw=78 syn=sgml
vi: ts=1 sw=1
-->