<?php
include_once $_SERVER['DOCUMENT_ROOT'] . '/include/shared-manual.inc';
$TOC = array();
$TOC_DEPRECATED = array();
$PARENTS = array();
include_once dirname(__FILE__) ."/toc/book.oci8.inc";
$setup = array (
  'home' => 
  array (
    0 => 'index.php',
    1 => 'PHP Manual',
  ),
  'head' => 
  array (
    0 => 'UTF-8',
    1 => 'es',
  ),
  'this' => 
  array (
    0 => 'oci8.connection.php',
    1 => 'Gesti&oacute;n de la conexi&oacute;n OCI8 y la cola de espera',
    2 => 'Gesti&oacute;n de la conexi&oacute;n OCI8 y la cola de espera',
  ),
  'up' => 
  array (
    0 => 'book.oci8.php',
    1 => 'OCI8',
  ),
  'prev' => 
  array (
    0 => 'oci8.examples.php',
    1 => 'Ejemplos',
  ),
  'next' => 
  array (
    0 => 'oci8.fan.php',
    1 => 'Soporte de FAN (Fast Application Notification : Notificaci&oacute;n R&aacute;pida de Aplicaci&oacute;n) OCI8',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'es',
    'path' => 'reference/oci8/connection.xml',
  ),
  'history' => 
  array (
  ),
);
$setup["toc"] = $TOC;
$setup["toc_deprecated"] = $TOC_DEPRECATED;
$setup["parents"] = $PARENTS;
manual_setup($setup);

contributors($setup);

?>
<div id="oci8.connection" class="chapter">
 <h1 class="title">Gestión de la conexión OCI8 y la cola de espera</h1>

 <div class="section">
  <h2 class="title">Funciones de conexión</h2>
  <p class="para">
   La extensión oci8 proporciona tres funciones diferentes para conectarse
   a Oracle. La función de conexión estándar es la función
   <span class="function"><a href="function.oci-connect.php" class="function">oci_connect()</a></span>. Esta función crea una conexión
   a la base de datos Oracle y devuelve un recurso utilizado
   por las futuras llamadas a la base de datos.
  </p>
  <p class="para">
   La conexión a un servidor Oracle es una operación razonablemente costosa
   en términos de tiempo. La función <span class="function"><a href="function.oci-pconnect.php" class="function">oci_pconnect()</a></span>
   utiliza un caché persistente de conexiones que puede ser reutilizado a través
   de diferentes scripts. Esto significa que una sola conexión será utilizada por
   proceso PHP (o un hijo Apache).
  </p>
  <p class="para">
   Si su aplicación se conecta a Oracle utilizando un juego diferente de derechos
   de base de datos para cada usuario web, el caché persistente utilizado
   por la función <span class="function"><a href="function.oci-pconnect.php" class="function">oci_pconnect()</a></span> se vuelve menos apropiado
   ya que el aumento del número de usuarios concurrentes afectará el rendimiento
   del servidor Oracle, ya que deberá mantener demasiadas conexiones en caché.
   Si su aplicación es de este tipo, se recomienda optimizar su aplicación
   utilizando las opciones de configuración <a href="oci8.configuration.php#ini.oci8.max-persistent" class="link">oci8.max_persistent</a> y <a href="oci8.configuration.php#ini.oci8.persistent-timeout" class="link">oci8.persistent_timeout</a>
   (estas opciones le dan control sobre el tamaño y la vida útil del caché
   de conexiones persistentes) o utilizar el pool de conexiones residentes de Oracle
   (para las bases de datos Oracle 11g y posteriores), o bien, utilizar la función
   <span class="function"><a href="function.oci-connect.php" class="function">oci_connect()</a></span>.
  </p>
  <p class="para">
   Las funciones <span class="function"><a href="function.oci-connect.php" class="function">oci_connect()</a></span> y <span class="function"><a href="function.oci-pconnect.php" class="function">oci_pconnect()</a></span>
   emplean un caché de conexiones; si se realizan múltiples llamadas
   a <span class="function"><a href="function.oci-connect.php" class="function">oci_connect()</a></span>, utilizando los mismos parámetros en
   un script dado, la segunda llamada y las siguientes devolverán el manejador
   de conexión existente. El caché utilizado por la función <span class="function"><a href="function.oci-connect.php" class="function">oci_connect()</a></span>
   se limpia al final de la ejecución del script o cuando se cierra explícitamente
   el manejador de conexión. <span class="function"><a href="function.oci-pconnect.php" class="function">oci_pconnect()</a></span> tiene un comportamiento
   sustancialmente idéntico, con la diferencia de que el caché se mantiene por separado
   y se conserva entre las peticiones HTTP.
  </p>
  <p class="para">
   Es importante recordar esta funcionalidad de caché, ya que da la apariencia de que
   los dos manejadores no están aislados a nivel de transacciones
   (en realidad representan el mismo manejador de conexión, por lo que no están aislados
   en absoluto). Si su conexión necesita dos conexiones separadas, aisladas
   a nivel de transacciones, debe utilizar la función <span class="function"><a href="function.oci-new-connect.php" class="function">oci_new_connect()</a></span>.
  </p>
  <p class="para">
   El caché de la función <span class="function"><a href="function.oci-pconnect.php" class="function">oci_pconnect()</a></span> se borra
   y todas las conexiones a la base de datos se cierran cuando el proceso
   PHP termina, por lo que las conexiones persistentes solo tienen interés cuando
   PHP se utiliza como módulo Apache o con FPM o similar.
   Las conexiones persistentes no tienen ningún interés a través de <span class="function"><a href="function.oci-connect.php" class="function">oci_connect()</a></span>
   cuando PHP se utiliza como CGI o en línea de comandos.
  </p>
  <p class="para">
   <span class="function"><a href="function.oci-new-connect.php" class="function">oci_new_connect()</a></span> siempre crea una nueva conexión al
   servidor Oracle, independientemente de la existencia de otras conexiones.
   Las aplicaciones web de alto tráfico deben evitar utilizar
   <span class="function"><a href="function.oci-new-connect.php" class="function">oci_new_connect()</a></span>, especialmente en las secciones
   más cargadas de la aplicación.
  </p>
  <p class="para">
   Las conexiones persistentes pueden ahora ser cerradas
   por el usuario, permitiendo un mejor control de los recursos
   de conexión. Las conexiones persistentes pueden ahora ser cerradas
   automáticamente cuando ninguna variable PHP las referencia, como podría ser el caso
   al final de un contexto de una función de usuario PHP.
   Esto invalidará todas las transacciones no confirmadas. Estos cambios en las
   conexiones persistentes hacen que funcionen como las funciones
   no persistentes, simplificando la interfaz, permitiendo una mayor
   coherencia de la aplicación y previsibilidad. Defina la directiva
   <a href="oci8.configuration.php#ini.oci8.old-oci-close-semantics" class="link">oci8.old_oci_close_semantics</a>
   a <em>On</em> para recuperar el comportamiento histórico.
  </p>
  <p class="para">
   El restablecimiento automático de las conexiones persistentes PHP
   después del reinicio de un proceso Apache o FPM hace que los triggers
   <code class="literal">LOGON</code> sean únicamente recomendados para definir
   los atributos de sesión y no las peticiones de conexión de usuarios
   por aplicación.
  </p>
 </div>
 <div class="section">
  <h2 class="title">Pool de conexión DRCP</h2>
  <p class="para">
   PHP soporta el pool de conexiones residentes
   Oracle (DRCP). DRCP permite utilizar más eficientemente la memoria de la base de datos
   y permite una mejor escalabilidad. Se requieren pocos o ningún cambio
   para aprovechar DRCP.
  </p>
  <p class="para">
   DRCP está previsto para aplicaciones que se conectan utilizando poco
   esquema de base de datos, y que mantienen las conexiones abiertas
   durante un corto período de tiempo. Las otras aplicaciones deben
   utilizar el proceso dedicado a la base de datos Oracle, o utilizar
   los servidores compartidos.
  </p>
  <p class="para">
   DRCP se beneficia de las 3 funciones de conexión, pero solo la función
   <span class="function"><a href="function.oci-pconnect.php" class="function">oci_pconnect()</a></span> ofrece el mayor rendimiento.
  </p>
  <p class="para">
   Para hacer DRCP disponible con OCI8, la versión de las bibliotecas clientes Oracle
   utilizadas por PHP así como la versión de la base de datos Oracle
   deben ser 11g o superiores.
  </p>
  <p class="para">
   La documentación sobre DRCP puede encontrarse en los diferentes manuales
   Oracle. Por ejemplo, consulte la
   <a href="https://docs.oracle.com/en/database/oracle/oracle-database/23/jjdbc/database-resident-connection-pooling.html" class="link external">&raquo;&nbsp;configuración del pool
    de conexiones residentes a la base de datos</a> de la documentación
   Oracle para un ejemplo de uso.
   Un <a href="https://www.oracle.com/technetwork/topics/php/whatsnew/php-scalability-ha-twp-128842.pdf" class="link external">&raquo;&nbsp;libro blanco sobre DRCP</a>
   contiene varias informaciones internas sobre DRCP.
  </p>
  <p class="para">
   Para utilizar DRCP, instale la extensión OCI8 y las
   bibliotecas Oracle 11g (o posterior), luego, siga estos pasos:
  </p>
  <p class="para">
   <ul class="itemizedlist">
    <li class="listitem">
     <p class="para">
      Utilizando los privilegios de administrador de la base de datos,
      utilice un programa como SQL*Plus para iniciar un pool
      de conexiones a la base de datos:
     </p>
     <p class="para">
      <div class="informalexample">
       <div class="example-contents screen">
<div class="cdata"><pre>
    SQL&gt; execute dbms_connection_pool.start_pool;
</pre></div>
       </div>
      </div>
     </p>
    </li>
    <li class="listitem">
     <p class="para">
      Opcionalmente, utilice <code class="literal">dbms_connection_pool.alter_param()</code>
      para configurar las opciones DRCP. Las opciones comunes del pool
      pueden encontrarse utilizando la vista <code class="literal">DBA_CPOOL_INFO</code>.
     </p>
    </li>
    <li class="listitem">
     <p class="para">
      Actualice las cadenas de conexión utilizadas. Para las aplicaciones PHP
      que actualmente se conectan mediante un nombre de conexión de red como
      <code class="literal">MYDB</code>:
     </p>
     <p class="para">
      <div class="informalexample">
       <div class="example-contents screen">
<div class="cdata"><pre>
    $c = oci_pconnect(&quot;myuser&quot;, &quot;mypassword&quot;, &quot;MYDB&quot;);
</pre></div>
       </div>
      </div>
     </p>
     <p class="para">
      modifique el archivo tnsnames.ora y añada una cláusula
      <code class="literal">(SERVER=POOLED)</code>, por ejemplo:
     </p>
     <p class="para">
      <div class="informalexample">
       <div class="example-contents screen">
<div class="cdata"><pre>
    MYDB = (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp) (HOST=myhost.dom.com)
           (PORT=1521))(CONNECT_DATA=(SERVICE_NAME=sales)
           (SERVER=POOLED)))
</pre></div>
       </div>
      </div>
     </p>
     <p class="para">
      De lo contrario, puede modificar la sintaxis de conexión fácil en PHP y añadir
      <code class="literal">:POOLED</code> después del nombre del servicio:
     </p>
     <p class="para">
      <div class="informalexample">
       <div class="example-contents screen">
<div class="cdata"><pre>
    $c = oci_pconnect(&quot;myuser&quot;, &quot;mypassword&quot;, &quot;myhost.dom.com:1521/sales:POOLED&quot;);
</pre></div>
       </div>
      </div>
     </p>
    </li>
    <li class="listitem">
     <p class="para">
      Edite <var class="filename">php.ini</var> y elija el nombre de la clase de conexión.
      Este nombre indica una división lógica del pool de conexión y puede
      ser utilizado para aislar el pool de diferentes aplicaciones.
      Todas las aplicaciones PHP utilizando el mismo usuario así como
      el mismo valor de clase de conexión podrán compartir
      el pool de conexiones, permitiendo así obtener una mayor disponibilidad.
     </p>
     <p class="para">
      <div class="informalexample">
       <div class="example-contents screen">
<div class="cdata"><pre>
    oci8.connection_class = &quot;MY_APPLICATION_NAME&quot;
</pre></div>
       </div>
      </div>
     </p>
    </li>
    <li class="listitem">
     <p class="para">
      Ejecute su aplicación, conéctese a la base de datos
      11g (o superior).
     </p>
    </li>
   </ul>
  </p>
  <blockquote class="note"><p><strong class="note">Nota</strong>: 
   <p class="para">
    Las aplicaciones que utilizan las bibliotecas cliente Oracle 10g que necesitan el rendimiento
    de las conexiones persistentes, pueden reducir la cantidad de memoria
    asignada al servidor de la base de datos utilizando los servidores
    compartidos Oracle (conocidos anteriormente como servidores multihilo).
    Consulte la documentación Oracle para obtener más información.
   </p>
  </p></blockquote>
  <blockquote class="note"><p><strong class="note">Nota</strong>: 
   <p class="para">
    La modificación de una contraseña durante conexiones DRCP fallará
    con el error &quot;<em>ORA-56609: Usage not supported with DRCP</em>&quot;.
    Esto es una restricción documentada de la base de datos Oracle 11g.
   </p>
  </p></blockquote>
 </div>
</div>
<?php manual_footer($setup); ?>