Foros del Web » Programando para Internet » PHP »

conexion persistente con Oracle

Estas en el tema de conexion persistente con Oracle en el foro de PHP en Foros del Web. utilizando OCIPLogon() no logro realizar una conexion persistente a una BD Oracle: sí que me conecto, y guardo la conexion en sesion, pero en la ...
  #1 (permalink)  
Antiguo 30/10/2003, 12:21
 
Fecha de Ingreso: octubre-2003
Mensajes: 9
Antigüedad: 14 años, 1 mes
Puntos: 0
conexion persistente con Oracle

utilizando OCIPLogon() no logro realizar una conexion persistente a una BD Oracle:

sí que me conecto, y guardo la conexion en sesion, pero en la siguiente pagina utilizando la conexion de la sesion, no la recupera (o no la mantiene)

no sé si es un problema de código o de configuracion de apache (está como "module" como debe ser para que funcionen las conexiones persistentes)

ejecuto script1:
<?
$conn = OCIPLogon ("xxx", "xxx", "xxx");

session_start();
session_register('session_conn');
$session_conn = $conn;

$sql = " SELECT ser_exp
FROM EXP_SERIE
WHERE ind='1' ";

$query = OCIParse($session_conn,$sql);
OCIDefineByName($query,"SER_EXP", $ser_exp);
OCIExecute($query);
OCIFetch($query);

echo "----> $session_conn <---- ";
echo "## $ser_exp ##";
?>

este código me devuelve:

----> Resource id #3 <---- ## 2003 ##

de modo que conecta y devuelve la conexion (resource id#3) el resultado de la select y el resultado de la select (2003)

luego ejecuto script2:
<?
session_start();

echo "----> $session_conn <---- ";

$sql = " SELECT ser_exp
FROM EXP_SERIE
WHERE ind='1' ";

$query = OCIParse($session_conn,$sql);
OCIDefineByName($query,"SER_EXP", $ser_exp);
OCIExecute($query);
OCIFetch($query);

echo "## $ser_exp ##";
?>

este código me devuelve:

----> 0 <---- ## ##

qué hago mal?

Última edición por pedriphp; 30/10/2003 a las 12:22
  #2 (permalink)  
Antiguo 31/10/2003, 05:46
 
Fecha de Ingreso: octubre-2003
Mensajes: 9
Antigüedad: 14 años, 1 mes
Puntos: 0
preguntado de otro modo:

- como recupero en un segundo script (de la misma sesion de navegador) la conexion abierta del primer script?

nota: he comprobado que la conexión queda residente, hay un proceso abierto, se trata de recuperarlo

nota2: puede ser que haya q buscar como recuperar el SID? como hacerlo?
  #3 (permalink)  
Antiguo 31/10/2003, 07:03
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
En general... en aplicaciones PHP .. la conexión si no usas conexiones permanentes a tu BD se cierran al terminar el script .. por ende en sucesivos scritps que llames deberias de abrir la conexión nuevamente.


(no se mucho sobre conexiónes persistentes y menos sobre Oracle ..pero ..)

Si ..
$conn = OCIPLogon ("xxx", "xxx", "xxx");

haces una conexión permanete y eso entrega el "resource" de tu BD .. Propaga ese $conn en tu variable de sesión y usalo en el 2º script.

Ahora .. la pregunta sería si es necesario serializar ese "ID de conexión" (no sé exactamente como se tratan ese tipo de "resources") .. tal vez haga falta hacerlo (con serialize() .. y al otro lado .. en el otro/s scripts unserialize() ..)

Pero, .. podrías ver si abriendo tu conexión OCPLogon() se mantiene tu "ID de conexión" .. En Myslq por lo menos si mal no recuerdo .. se mantiene el ID de conexión (en conexiones permanentes) si es llamado por el mismo cliente que estableció la conexión.

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #4 (permalink)  
Antiguo 31/10/2003, 12:08
 
Fecha de Ingreso: octubre-2003
Mensajes: 9
Antigüedad: 14 años, 1 mes
Puntos: 0
por lo que he podido comprobar, con OCIPLogon(), aparentemente la conexión es Persistente SIN necesidad de guardarla en una sesión o cookie, ni envío como parámetro!!!

simplemente para esa sesión web (no de navegador ya que se mantiene aún cerrando el navegador), se mantiene de forma transparente la conexión, pero curiosamente para cada llamada, se utiliza la sintaxis:

$conn = OCIPLogon ("xxx", "xxx", "xxx");

yo creía que había que identificar esta conexión de algún modo para reutilizarla y por lo visto es inherente a la llamada con OCIPLogon()

Otro tema ahora es tener en cuenta que aunque se cierre el navegador persistirá la conexión (y si hay 10 usuarios persistirán 10 conexiones, por ejemplo), hasta que se reinicie el servidor web (apache), con el consiguiente peligro de que se puede llegar al nº máximo de conexiones permitidas con el consiguiente bloqueo de servidor web y/o BD.

Soluciones:

- reinicio de apache cada X tiempo (nada elegante)
- proveer en el código un link que ejecute un OCILogoff (no asegura el no llegar al límite de conexiones, según la solidaridad del usuario)
- matar sesiones desde oracle, al X tiempo de inactividad (solución casi ideal, aunque no la he probado)
  #5 (permalink)  
Antiguo 31/10/2003, 14:48
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
mm Podrías usar:

ignore_user_abort() y funciones afines:
http://www.php.net/manual/en/feature...n-handling.php

Así controlas cuando un script ha sido terminado por el usuario.

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 17:10.