<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta content="text/html;charset=ISO-8859-1" http-equiv="Content-Type">
<title></title>
</head>
<body bgcolor="#ffffff" text="#000000">
JuanPa wrote:
<blockquote cite="mida9b983730602100539y487e39bau@mail.gmail.com"
type="cite">
<div>
<div>Hola listeros....<br>
Te agradezco nuevamente Rodrigo por dar tu valioso tiempo aclarando mis
dudas, <br>
<br>
A raiz de es comentario es que he optado por utilizar mis clasicas
conexiones no persistentes .<br>
</div>
</div>
</blockquote>
ejalé ;)<br>
<blockquote cite="mida9b983730602100539y487e39bau@mail.gmail.com"
type="cite">
<div><br>
<blockquote class="gmail_quote"
style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">Es
mejor usar conexiones no persistentes, es decir, abriendo la conexión<br>
al principio de tu script y cerrando la conexión al final, pues siempre
<br>
vas a tener páginas que no hagan ninguna consulta a la base de datos...<br>
¿Para qué, entonces, tendrás una conexión abierta? Es únicamente un<br>
desperdicio de recursos.</blockquote>
<div><br>
Ademas no voy a esperar que el GC (Garbage Colector) haga su trabajo,
una ultima cosa...
<br>
</div>
</div>
</blockquote>
Bueno el recolector de basura funcionará igual, pero cerrando menos
cosas.<br>
<blockquote cite="mida9b983730602100539y487e39bau@mail.gmail.com"
type="cite">
<div>
<blockquote class="gmail_quote"
style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">Por
eso es mejor abrir la conexión al principio de un script y cerrarla<br>
al final, y si tienes funciones que recuperan datos como el caso de tu
<br>
buscar alumno, en vez de abrir una conexión nueva, preguntes si ya hay<br>
una conexión abierta para aprovecharla.</blockquote>
<div><br>
Pero ¿ esto no significa que la conexion deberìa ser persistente? o te
refieres a que deberia pasar por parametros a mi objeto conexion que
tiene un recurso de conexion interno($link) y luego verificar si esta
está abierta.
<br>
</div>
</div>
</blockquote>
Una conexión no persistente se abre al inicio de un archivo (supongamos
insertar.php) y se debe cerrar al final de éste. Si tienes un archivo
que se llama modificar.php, ese debe declarar otra conexión, pues la
primera no estará.<br>
<br>
La conexión persistente se abre al inicio de la sesión (mientras el
usuario está conectado) y puede pasarse por varias páginas. Si tienes
un archivo insertar, modificar, eliminar, buscar, etc,
cuantoquieras.php, todos esos archivos usarán conexiones persistentes.<br>
<br>
<!-- leo de otro mail<br>
una conexion persistente permite re-utilizar una conexion ya abierta,
ademas de
tener que cerrarla explicitamente sino queda "abierta"! la idea es
evitar el tiempo
(milisegundos?) que se ocupa en "establecer" una conexion. su uso a mi
entender
esta reservado a sitios con muchas conexiones nuevas, con procesos
cortos.
<br>
-- leido --><br>
<br>
Esto es cierto, yo dije "una vez por usuario/sesión", queriendo enfocar
a que la conexión estaba abierta y podía ser aprovechada por varias
páginas que visita un usuario desde un navegador. (pues una conexión se
abre solamente para un usuario).<br>
<br>
<blockquote cite="mida9b983730602100539y487e39bau@mail.gmail.com"
type="cite">
<div>Y finalmente cuando dices... <br>
</div>
<blockquote class="gmail_quote"
style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">Cualquiera
de las dos conexiones funciona así, la diferencia es que la
<br>
persistente la abres una vez por usuario (o por conexion?) ...<br>
</blockquote>
Esto significa ¿ Que la conexion seguira abierta en cada script que
valla ejecutando el usuario, mientras no se cierre explicitamente en
otro script o cuando el usuario cierre el navegador ?
<br>
</blockquote>
Ahhh, eso con ejemplo (ahora haré código real con adodb)... "notese,
solamente una conexión no persistente"<br>
<br>
<?php<br>
echo("Abriendo la primera conexión")<br>
$conexion = ADONewConnection("postgres");<br>
$conexion->NConnect($host,$user,$pass,$base);<br>
$sql = $conexion->Prepare("SELECT * FROM alumno WHERE rut_alumno
= ?");<br>
$rs = $conexion->Execute($sql,array('12345678-9'));<br>
$conexion->Close();<br>
<br>
echo("Abriendo la segunda conexión");<br>
$conexion = ADONewConnection("postgres");<br>
$conexion->NConnect($host,$user,$pass,$base);<br>
$sql = $conexion->Prepare("SELECT * FROM apoderado WHERE
rut_alumno = ?");<br>
$rs = $conexion->Execute($sql,array('12345678-9'));<br>
$conexion->Close();<br>
<br>
$conexion = ADONewConnection("postgres");<br>
$conexion->NConnect($host,$user,$pass,$base);<br>
$sql = $conexion->Prepare("SELECT * FROM cuotas WHERE rut_alumno
= ?");<br>
$rs = $conexion->Execute($sql,array('12345678-9'));<br>
$conexion->Close();<br>
?><br>
<br>
El ejemplo anterior es un script demasiado mega mal hecho. Abres tres
veces una conexión nueva y no destruyes las conexiones anteriores.
Digamos que solamente las desconectas. Uhhh, en este pequeño script te
gastaste tres conexiones. ¿Qué mal, no?. Pues ahora veamos cómo lo
habría hecho con una sola conexión no persistente.<br>
<br>
<?php<br>
echo("Abriendo la conexión")<br>
$conexion = ADONewConnection("postgres");<br>
$conexion->NConnect($host,$user,$pass,$base);<br>
<br>
dibujemos();<br>
<br>
// con la misma conexion no persistente, puedes hacer UNA<br>
$sql = $conexion->Prepare("SELECT * FROM alumno WHERE rut_alumno
= ?");<br>
$rs = $conexion->Execute($sql,array('12345678-9'));<br>
<br>
juguemos_en_el_bosque();<br>
<br>
// DOS<br>
$sql = $conexion->Prepare("SELECT * FROM apoderado WHERE
rut_alumno = ?");<br>
$rs = $conexion->Execute($sql,array('12345678-9'));<br>
<br>
mientras_el_lobo_no_esta();<br>
<br>
// TRES y más consultas en el mismo script.<br>
$sql = $conexion->Prepare("SELECT * FROM cuotas WHERE rut_alumno
= ?");<br>
$rs = $conexion->Execute($sql,array('12345678-9'));<br>
<br>
lobo_esta(?);<br>
<br>
// Y antes de cerrar el script, la conexión se cierra sola.<br>
$conexion->Close();<br>
<br>
terminado();<br>
<br>
exit();<br>
?><br>
<br>
El ejemplito este aprovecha una sola conexión no persistente, pero
usando solamente "UN" script, lo cual a pesar de que está bien, te
ensucia un poco el código y te lo hace un poquito ilegible, por todas
esas SQL por aquí y por allá. OK, ahora vamos a hacer un script para
las funciones, un script para abrir y cerrar la conexión, y tu script
de lógica de negocios:<br>
<br>
<!-- conexion.php --><br>
<?php<br>
// nuestra función que nos abre muchas puertas<br>
function abrir_conexion()<br>
{<br>
require_once('adodb/adodb.inc.php');<br>
<br>
$host = "123.123.123.123";<br>
$user = "postgres";<br>
$pass = "nula";<br>
$base = "carepescao"; <br>
<br>
$conexion = ADONewConnection("postgres");<br>
$conexion->NConnect($host, $user, $pass, $base);<br>
<br>
if(!$conexion->IsConnected)<br>
{<br>
die("Arghhh mi jefe me va a matar! me pitié la conexión");<br>
}<br>
}<br>
<br>
// la función que cierra con llave cuando nos vayamos ;)<br>
function cerrar_conexion();<br>
{<br>
if($conexion->IsConnected)<br>
{<br>
$conexion->Close();<br>
} <br>
}<br>
<br>
?><br>
<br>
<!-- leo nuevamente:<br>
originalmente tu preguntaste por un "pool" de conexiones lo cual es
diferente
ya que ahi se puede compartir conexiones <b class="moz-txt-star"><span
class="moz-txt-tag">*</span>entre<span class="moz-txt-tag">*</span></b>
procesos, y eso en PHP
se tiene que hacer con ayuda externa.<br>
--><br>
<br>
Nótese que compartir conexiones entre procesos (pooling) tiene
diferencias con
aprovechar las conexiones no persistentes: lo que vamos a hacer en el
siguiente archivo aprovecha una conexión no persistente que esté
abierta, en vez de estar abriendo y cerrando. Esto para mí también es
llamado pooling, pero básico, y aunque no sea un proceso automatizado,
así es como trabaja... La idea es siempre tener una y sólo una conexión
disponible cuando la usemos sin tener que abrirla más que lo necesario,
y cerrarla cuando ya tengamos todas nuestras operaciones hechas y no
vayamos a usarla de inmediato, bien por estar requiriendo datos, bien
por ya haberlos obtenido y estamos mostrándolos en otra página. La
cerramos para liberar recursos y así optimizamos cualquier cantidad de
memoria. Esta clase de pooling no comparte conexiones entre procesos
(para mí un proceso tiene un PID y tiene un destino distinto).<br>
<br>
<!-- sql.php --><br>
<?php<br>
require_once 'conexion.php';<br>
<br>
// una funcion que lo unico que hace es retornar el recordset.<br>
function buscar_alumno($rut)<br>
{<br>
if(!$conexion->IsConnected || !isset($conexion))<br>
{<br>
abrir_conexion();<br>
}<br>
$sql = $conexion->Prepare("SELECT * FROM alumno WHERE
rut_alumno = ?");<br>
$rs = $conexion->Execute($sql,array($rut));<br>
return $rs;<br>
}<br>
<br>
// una funcion que lo unico que hace es retornar el recordset.<br>
function buscar_apoderado($rut)<br>
{<br>
if(!$conexion->IsConnected || !isset($conexion))<br>
{<br>
abrir_conexion();<br>
}<br>
$sql = $conexion->Prepare("SELECT * FROM apoderado WHERE
rut_alumno = ?");<br>
$rs = $conexion->Execute($sql,array($rut));<br>
return $rs;<br>
}<br>
<br>
// una funcion que lo unico que hace es retornar el recordset.<br>
function buscar_cuotas($rut)<br>
{<br>
si la conexión no existe, o no se ha seteado, entonces abrimos
la conexion. Si la conexion existe, para que?<br>
if(!$conexion->IsConnected || !isset($conexion))<br>
{<br>
abrir_conexion();<br>
}<br>
$sql = $conexion->Prepare("SELECT * FROM cuotas WHERE
rut_alumno = ?");<br>
$rs = $conexion->Execute($sql,array($rut));<br>
return $rs;<br>
}<br>
?><br>
<br>
<!-- bussiness.php --><br>
<?php<br>
require_once 'conexion.php';<br>
require_once 'sql.php';<br>
<br>
// abrimos la conexion();<br>
abrir_conexion();<br>
<br>
// procesamos algunas cosas...<br>
dibujemos();<br>
<br>
// llamamos a nuestra consulta.<br>
// esto ya es lógica de negocios, ¿no? <br>
$resultado1 = buscar_alumno($rut);<br>
<br>
// tururururu, me gusta cantar...<br>
juguemos_en_el_bosque();<br>
<br>
// nuestra logica de negocios requiere que<br>
// busquemos al responsable por el cabro de ... ;)<br>
$resultado2 = buscar_apoderado($rut);<br>
<br>
// el lobo andaba comiéndose unas abuelitas por ahi<br>
mientras_el_lobo_no_esta();<br>
<br>
// de nuevo, no necesitamos de SQL feos por ahi...<br>
$resultado3 = buscar_cuotas($rut);<br>
<br>
// mostramos los resultados en la pantalla...<br>
lobo_esta(?);<br>
<br>
// cerramos la conexion...<br>
cerrar_conexion();<br>
<br>
// cerramos algunas otras cosillas, o bien cargamos el footer, que
se yo,<br>
terminado();<br>
<br>
// una vieja costumbre mía, heredada de los antiguos BASIC de ATARI.<br>
// nadie me ha convencido de que esto no es necesario<br>
exit();<br>
?><br>
<br>
Como puedes ver, finalmente son más archivos, pero el que te interesa
que es la lógica de negocios, te queda lindo para leer. La cosa es
diseñar un poco más ordenado. El que programes en 3, 4, 5 o 100 capas
si quieres no significa que las capas no se interconecten, pues la
lógica de presentación necesita que la lógica de negocios le pase
datos, y la lógica de negocios necesita conectarse a la base de datos,
para que tenga algo que procesar!!!<br>
<blockquote cite="mida9b983730602100539y487e39bau@mail.gmail.com"
type="cite">Mil disculpas si soy muy pregunton, pero siempre me gusta
sacar conclusiones valiosas de las conversaciones.... Gracias de
antemano...<br>
</blockquote>
Cero dramas. Si Google no es claro en el asunto (de hecho no lo fue
cuando lo investigué) no hay problemas en discutirlo y aclarar las
dudas.<br>
<blockquote cite="mida9b983730602100539y487e39bau@mail.gmail.com"
type="cite">Nos leemos<br>
-----------------<br>
Juan Pablo</blockquote>
</body>
</html>