1
0
mirror of https://github.com/php/doc-es.git synced 2026-03-29 01:42:12 +01:00
Files
archived-doc-es/reference/oci8/connection.xml
Pedro Antonio Gil Rodríguez 6dbf6ce42d Actualización a la última versión
git-svn-id: https://svn.php.net/repository/phpdoc/es/trunk@338285 c90b9560-bf6c-de11-be94-00142212c4b1
2015-12-17 13:14:23 +00:00

336 lines
13 KiB
XML

<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
<!-- EN-Revision: 05699686607d6714c532dafac4e19de932cb7c63 Maintainer: seros Status: ready -->
<!-- Reviewed: no -->
<chapter xml:id="oci8.connection" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink">
<title>Manejo de conexiones de OCI8 y agrupamiento de conexiones</title>
<section>
<title>Funciones de conexión</title>
<para>
La extenisón OCI8 proporciona tres funciones diferentes para
conectarse a Oracle. La función de conexión estándar
es <function>oci_connect</function>. Esta crea una conexión a
una base de datos de Oracle y devuelve un recurso utilizado por las llamadas
subsiguientes a dicha base de datos.
</para>
<para>
Conectarse a un servidor Oracle es una operación razonablemente cara
en términos del tiempo que toma en completarse.
La función <function>oci_pconnect</function> utiliza una caché de conexiones
persistentes que puede ser reutilizada a través de diferentes peticiones de
scripts. Esto significa que una conexión únicamente tendrá carga adicional normalmente
una vez por cada proceso de PHP (o subproceso de Apache).
</para>
<para>
Si una aplicación se conecta a Oracle usando un conjunto diferente de
credenciales para cada usuario de la web, la caché persistente empleada por
<function>oci_pconnect</function> no será muy útil ya que el
número de usuarios concurrentes aumentará, hasta el punto donde podría
empezar a afectar negativamente al rendimiendo global del servidor de Oracle
debido a que mantiene demasiadas conexiones inactivas. Si la
aplicación está estructurada de esta manera, se recomienda
ajustarla a través de las opciones de configuración
<link linkend="ini.oci8.max-persistent">oci8.max_persistent</link>
y <link linkend="ini.oci8.persistent-timeout">oci8.persistent_timeout</link>
(éstas otorgan control sobre el tamaño y el tiempo de vida
de la caché de conexiones persistentes), usar Oracle Database
Resident Connection Pooling (en Oracle Database 11g o posterior), o usar
<function>oci_connect</function> en su lugar.
</para>
<para>
<function>oci_connect</function>
y <function>oci_pconnect</function> emplean una caché de conexiones; si
mútiples llamadas a
<function>oci_connect</function> usan los mismos parámetros en un script
dado, la segunda y subsiguientes llamadas devolverán el gestor de conexión
existente. La caché usada por
<function>oci_connect</function> se limpia al final de la ejecución
del script, o cuando se cierra explícitamente el gestor de conexión. La
función <function>oci_pconnect</function> tiene un comportamiento similar,
aunque su caché se mantiene de forma separada y sobrevive entre
peticiones HTTP.
</para>
<para>
Esta característica de almacenamiento en caché significa que dos gestores no están transaccionalmente
aislados (de hecho, son el mismo gestor de conexión, por lo que no existe
aislamiento alguno). Si la aplicación necesita dos conexiones transaccionalmente
aisladas por separado, se ha de usar
<function>oci_new_connect</function>.
</para>
<para>
La caché de <function>oci_pconnect</function> es limpiada y cualquier
conexión a bases de datos cerrada cuando finaliza el proceso de PHP, por lo que
el uso efectivo de conexiones persistentes requiere que PHP sea un
módulo de Apache o se use con FCGI, o similar. Las conexiones persistentes
no tendrán ningún beneficio con <function>oci_connect</function>
cuando PHP se use con CGI o mediante la línea de comandos.
</para>
<para>
La función <function>oci_new_connect</function> siempre crea una
nueva conexión al servidor de Oracle, independientemente de que existan
otras conexiones. Las aplicaciones web con mucho tráfico
deberían evitar el uso de
<function>oci_new_connect</function>, especialmente las secciones más concurridas de
la aplicación.
</para>
</section>
<section>
<title>Agrupamiento de conexiones DRCP</title>
<para>
PHP, desde 5.3 (PECL OCI8 1.3), posee soporte para Oracle Database Resident
Connection Pooling (DRCP). DRCP permite el uso más eficiente de la memoria
de la máquina donde reside la base de datos y proporciona una alta escalabilidad. Se
requiren cambios mínimos, o ninguno, en la aplicación para usar DRCP.
</para>
<para>
DRCP es apropiado para aplicaciones que se conectan usando pocos esquemas de
bases de datos y mantienen abiertas dichas conexiones durante un corto periodo de
tiempo. Las demás aplicaciones deberían usar los procesos de servidor de bases de datos
predeterminado <literal>Dedicado</literal> de Oracle, o
usar servidores <literal>Compartidos</literal>.
</para>
<para>
DRCP beneficia a las tres funciones de conexión, pero proporciona la mayor
escalabilidad cuando las conexiones se crean
con <function>oci_pconnect</function>.
</para>
<para>
Para que DRCP esté disponible en OCI8, las bibliotecas cliente de Oracle usadas por
PHP y la versión de Oracle Database deben ser 11g o superior.
</para>
<para>
La documentación de DRCP se encuentra en varios manuales de Oracle. Por
ejemplo,
véase <link xlink:href="&url.oracle.drcp.configure;">Configuring
Database Resident Connection Pooling</link> en la documentación de
Oracle para obtner información de su uso.
Un <link xlink:href="&url.oracle.drcp.whitepaper;">Libro blanco
de DRCP</link> contiene información de antecedentes sobre DRCP.
</para>
<para>
Para usar DRCP, construya PHP con la extensión OCI8 1.3 (o posterior) y las bibliotecas de
Oracle 11g (o posteriores), y luego siga estos pasos:
</para>
<para>
<itemizedlist>
<listitem>
<para>
Como administrador de bases de datos privilegiado, use un programa como
SQL*Plus para iniciar el agrupamiento de conexiones en la base de datos:
</para>
<para>
<informalexample>
<screen>
<![CDATA[
SQL> execute dbms_connection_pool.start_pool;
]]>
</screen>
</informalexample>
</para>
</listitem>
<listitem>
<para>
Opcionalmente
use <literal>dbms_connection_pool.alter_param()</literal> para
configurar los ajustes de DRCP. La configuración de la agrupación actual se puede
consultar desde la vista <literal>DBA_CPOOL_INFO</literal>.
</para>
</listitem>
<listitem>
<para>
Actualice las cadenas de conexión usadas. Para las aplicaciones de PHP que
actualmente se conecten usando un Nombre de Conexión de Red
como <literal>MYDB</literal>:
</para>
<para>
<informalexample>
<screen>
<![CDATA[
$c = oci_pconnect("mi_usuario", "mi_contraseña", "MYDB");
]]>
</screen>
</informalexample>
</para>
<para>
Modifique el fichero tnsnames.ora y añada
una cláusula <literal>(SERVER=POOLED)</literal>, por ejemplo:
</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>
Alternativamente, modifique la sintaxis de Easy Connect en PHP y añada
<literal>:POOLED</literal> después del nombre del servidor:
</para>
<para>
<informalexample>
<screen>
<![CDATA[
$c = oci_pconnect("mi_usuario", "mi_contraseña", "mi_host.dom.com:1521/sales:POOLED");
]]>
</screen>
</informalexample>
</para>
</listitem>
<listitem>
<para>
Edite &php.ini; y elija un nombre de clase de conexión. Este nombre
señala una división lógica de la agrupación de conexiones y se puede
usar para aislar la agrupación para diferentes aplicaciones. Cualquier aplicación
de PHP con el mismo nombre de usuario y valor de clase de conexión
podrá compartir conexiones de la agrupación, proporcionando una mayor
escalabilidad.
</para>
<para>
<informalexample>
<screen>
<![CDATA[
oci8.connection_class = "NOMBRE_DE_MI_APLICACIÓN"
]]>
</screen>
</informalexample>
</para>
</listitem>
<listitem>
<para>
Ejecute la aplicación, conectándose a la base de datos 11g (o posterior).
</para>
</listitem>
</itemizedlist>
</para>
<note>
<para>
Las aplicaciones que usen Oracle 10g que requieran el rendimiento de
conexiones persitentes, pueden reducir la cantidad de memoria que el servidor de
bases de datos use utilizando sevidores <literal>Compartidos</literal> de Oracle
(anteriormente conocidos como Servidores de Multisubprocesos). Consulte la documentación
de Oracle para más información.
</para>
</note>
</section>
<section>
<title>Recomendaciones para DRCP y limitaciones conocidas</title>
<para>
El cambio de una contraseña con conexiones DRCP fallará con el error
<emphasis>ORA-56609: Usage not supported with DRCP</emphasis>.
Ésta es una restricción documentada de Oracle Database 11g.
</para>
<para>
Con la extensión OCI8 1.3, las conexiones persistentas pueden ser
cerradas por el usuario, permitiendo mayor control sobre el uso de recursos
de conexión. Las conexiones persistentes ahora también serán cerradas
automáticamente cuando no haya variables de PHP que hagan referncia a ellas, como
al final del ámbito de una función de usuario de PHP. Esto revertirá
cualquier transacción no consignada. Estos cambios a las conexiones
persistentes hacen que se comporten de forma similar a las conexiones no
persistentes, simplificando la interfaz, permitiendo así mayor
consistencia y predictabilidad a las aplicaciones.
Use <link linkend="ini.oci8.old-oci-close-semantics">oci8.old_oci_close_semantics</link>
con el valor de
<emphasis>On</emphasis> para conservar el comportamiento histórico.
</para>
<para>
Si Oracle Database es la versión 11.1.0.6, se deben aplicar los parches de las
bases de datos de Oracle para el error 6474441 de Oracle para usar DRCP.
Sin este parche, los errores como <emphasis>ORA-01000: maximum
open cursors exceeded</emphasis>, <emphasis>ORA-01001 invalid
cursor</emphasis> o <emphasis>ORA-01002 fetch out of
sequence</emphasis> podrían ocurrir. Este error fue corregido en Oracle
11.1.0.7 en adelante.
</para>
<para>
Si no se puede aplicar el parche de las bases de datos de Oracle 11.1.0.6, se pueden seguir
una de estas tres alternativas en su lugar:
</para>
<para>
<itemizedlist>
<listitem>
<simpara>
Conectarse usando servidores de Oracle <literal>Dedicados</literal>
o <literal>Compartidos</literal> en lugar de DRCP.
</simpara>
</listitem>
<listitem>
<simpara>
Establecer <link linkend="ini.oci8.statement-cache-size">oci8.statement_cache_size</link> de PHP
a 0.
</simpara>
</listitem>
<listitem>
<simpara>
Establecer un evento en el fichero de parámetros de inicialización de bases de datos:
<emphasis>event="56699 trace name context forever, level 128"</emphasis>.
</simpara>
</listitem>
</itemizedlist>
</para>
<para>
Los parches Oracle Database 11.1.0.7 y Oracle Database 11.1.0.6 para
el error 6474441 de Oracle permiten a las aplicacinones de PHP con conexión DRCP
usar el disparador <literal>LOGON</literal> de la base de datos para establecer las propiedades
de una sesión en el momento de crearla. Ejemplo de tales
configuraciones son el lenguaje NLS y el formato de fecha.
</para>
<para>
Si no se puede aplicar el parche para bases de datos Oracle 11.1.0.6, se pueden seguir
las siguientes alternativas en lugar
de usar los disparadores <literal>LOGON</literal>:
</para>
<para>
<itemizedlist>
<listitem>
<simpara>
Después de la identificación, establecer explícitamente las propiedades de la sesión usando
código de la aplicación de PHP.
</simpara>
</listitem>
<listitem>
<simpara>
Conectarse usando servidores de Oracle <literal>Dedicados</literal>
o <literal>Compartidos</literal> en lugar de DRCP.
</simpara>
</listitem>
</itemizedlist>
</para>
<para>
El reestableciemiento automático de las conexiones persistentes de PHP después
de la regeneración de procesos de Apache o FCGI significa que únicamente se recomiendan
los disparadores <literal>LOGON</literal> de PHP para establecer los atributos de sesiones
y no para peticiones de conexiones de usuario por cada aplicación. Esto es incluso más recomendado
con DRCP debido al ajuste automático de la agrupación y a la
manera de desencadenar los disparadores <literal>LOGON</literal> con la
autenticación de DRCP.
</para>
</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
-->