<!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&eacute; ;)<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&oacute;n<br>
al principio de tu script y cerrando la conexi&oacute;n al final, pues siempre
    <br>
vas a tener p&aacute;ginas que no hagan ninguna consulta a la base de datos...<br>
&iquest;Para qu&eacute;, entonces, tendr&aacute;s una conexi&oacute;n abierta? Es &uacute;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&aacute; 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&oacute;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&oacute;n nueva, preguntes si ya hay<br>
una conexi&oacute;n abierta para aprovecharla.</blockquote>
  <div><br>
Pero &iquest; esto no significa que la conexion deber&igrave;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&aacute; abierta.
  <br>
  </div>
  </div>
</blockquote>
Una conexi&oacute;n no persistente se abre al inicio de un archivo (supongamos
insertar.php) y se debe cerrar al final de &eacute;ste. Si tienes un archivo
que se llama modificar.php, ese debe declarar otra conexi&oacute;n, pues la
primera no estar&aacute;.<br>
<br>
La conexi&oacute;n persistente se abre al inicio de la sesi&oacute;n (mientras el
usuario est&aacute; conectado) y puede pasarse por varias p&aacute;ginas. Si tienes
un archivo insertar, modificar, eliminar, buscar, etc,
cuantoquieras.php, todos esos archivos usar&aacute;n conexiones persistentes.<br>
<br>
&lt;!-- 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 --&gt;<br>
<br>
Esto es cierto, yo dije "una vez por usuario/sesi&oacute;n", queriendo enfocar
a que la conexi&oacute;n estaba abierta y pod&iacute;a ser aprovechada por varias
p&aacute;ginas que visita un usuario desde un navegador. (pues una conexi&oacute;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&iacute;, la diferencia es que la
    <br>
persistente la abres una vez por usuario (o por conexion?) ...<br>
  </blockquote>
Esto significa &iquest; 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&eacute; c&oacute;digo real con adodb)... "notese,
solamente una conexi&oacute;n no persistente"<br>
<br>
&lt;?php<br>
&nbsp;&nbsp;&nbsp; echo("Abriendo la primera conexi&oacute;n")<br>
&nbsp;&nbsp;&nbsp; $conexion = ADONewConnection("postgres");<br>
&nbsp;&nbsp;&nbsp; $conexion-&gt;NConnect($host,$user,$pass,$base);<br>
&nbsp;&nbsp;&nbsp; $sql = $conexion-&gt;Prepare("SELECT * FROM alumno WHERE rut_alumno
= ?");<br>
&nbsp;&nbsp;&nbsp; $rs = $conexion-&gt;Execute($sql,array('12345678-9'));<br>
&nbsp;&nbsp;&nbsp; $conexion-&gt;Close();<br>
<br>
&nbsp;&nbsp;&nbsp; echo("Abriendo la segunda conexi&oacute;n");<br>
&nbsp;&nbsp;&nbsp; $conexion = ADONewConnection("postgres");<br>
&nbsp;&nbsp;&nbsp; $conexion-&gt;NConnect($host,$user,$pass,$base);<br>
&nbsp;&nbsp;&nbsp; $sql = $conexion-&gt;Prepare("SELECT * FROM apoderado WHERE
rut_alumno = ?");<br>
&nbsp;&nbsp;&nbsp; $rs = $conexion-&gt;Execute($sql,array('12345678-9'));<br>
&nbsp;&nbsp;&nbsp; $conexion-&gt;Close();<br>
<br>
&nbsp;&nbsp;&nbsp; $conexion = ADONewConnection("postgres");<br>
&nbsp;&nbsp;&nbsp; $conexion-&gt;NConnect($host,$user,$pass,$base);<br>
&nbsp;&nbsp;&nbsp; $sql = $conexion-&gt;Prepare("SELECT * FROM cuotas WHERE rut_alumno
= ?");<br>
&nbsp;&nbsp;&nbsp; $rs = $conexion-&gt;Execute($sql,array('12345678-9'));<br>
&nbsp;&nbsp;&nbsp; $conexion-&gt;Close();<br>
?&gt;<br>
<br>
El ejemplo anterior es un script demasiado mega mal hecho. Abres tres
veces una conexi&oacute;n nueva y no destruyes las conexiones anteriores.
Digamos que solamente las desconectas. Uhhh, en este peque&ntilde;o script te
gastaste tres conexiones. &iquest;Qu&eacute; mal, no?. Pues ahora veamos c&oacute;mo lo
habr&iacute;a hecho con una sola conexi&oacute;n no persistente.<br>
<br>
&lt;?php<br>
&nbsp;&nbsp;&nbsp; echo("Abriendo la conexi&oacute;n")<br>
&nbsp;&nbsp;&nbsp; $conexion = ADONewConnection("postgres");<br>
&nbsp;&nbsp;&nbsp; $conexion-&gt;NConnect($host,$user,$pass,$base);<br>
<br>
&nbsp;&nbsp;&nbsp; dibujemos();<br>
<br>
&nbsp;&nbsp;&nbsp; // con la misma conexion no persistente, puedes hacer UNA<br>
&nbsp;&nbsp;&nbsp; $sql = $conexion-&gt;Prepare("SELECT * FROM alumno WHERE rut_alumno
= ?");<br>
&nbsp;&nbsp;&nbsp; $rs = $conexion-&gt;Execute($sql,array('12345678-9'));<br>
<br>
&nbsp;&nbsp;&nbsp; juguemos_en_el_bosque();<br>
<br>
&nbsp;&nbsp;&nbsp; // DOS<br>
&nbsp;&nbsp;&nbsp; $sql = $conexion-&gt;Prepare("SELECT * FROM apoderado WHERE
rut_alumno = ?");<br>
&nbsp;&nbsp;&nbsp; $rs = $conexion-&gt;Execute($sql,array('12345678-9'));<br>
<br>
&nbsp;&nbsp;&nbsp; mientras_el_lobo_no_esta();<br>
<br>
&nbsp;&nbsp;&nbsp; // TRES y m&aacute;s consultas en el mismo script.<br>
&nbsp;&nbsp;&nbsp; $sql = $conexion-&gt;Prepare("SELECT * FROM cuotas WHERE rut_alumno
= ?");<br>
&nbsp;&nbsp;&nbsp; $rs = $conexion-&gt;Execute($sql,array('12345678-9'));<br>
<br>
&nbsp;&nbsp;&nbsp; lobo_esta(?);<br>
<br>
&nbsp;&nbsp;&nbsp; // Y antes de cerrar el script, la conexi&oacute;n se cierra sola.<br>
&nbsp;&nbsp;&nbsp; $conexion-&gt;Close();<br>
<br>
&nbsp;&nbsp;&nbsp; terminado();<br>
<br>
&nbsp;&nbsp;&nbsp; exit();<br>
?&gt;<br>
<br>
El ejemplito este aprovecha una sola conexi&oacute;n no persistente, pero
usando solamente "UN" script, lo cual a pesar de que est&aacute; bien, te
ensucia un poco el c&oacute;digo y te lo hace un poquito ilegible, por todas
esas SQL por aqu&iacute; y por all&aacute;. OK, ahora vamos a hacer un script para
las funciones, un script para abrir y cerrar la conexi&oacute;n, y tu script
de l&oacute;gica de negocios:<br>
<br>
&lt;!-- conexion.php --&gt;<br>
&lt;?php<br>
&nbsp;&nbsp;&nbsp; // nuestra funci&oacute;n que nos abre muchas puertas<br>
&nbsp;&nbsp;&nbsp; function abrir_conexion()<br>
&nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; require_once('adodb/adodb.inc.php');<br>
<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; $host = "123.123.123.123";<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; $user = "postgres";<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; $pass = "nula";<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; $base = "carepescao"; <br>
<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; $conexion = ADONewConnection("postgres");<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; $conexion-&gt;NConnect($host, $user, $pass, $base);<br>
<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(!$conexion-&gt;IsConnected)<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; die("Arghhh mi jefe me va a matar! me piti&eacute; la conexi&oacute;n");<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp;&nbsp; }<br>
<br>
&nbsp;&nbsp;&nbsp; // la funci&oacute;n que cierra con llave cuando nos vayamos ;)<br>
&nbsp;&nbsp;&nbsp; function cerrar_conexion();<br>
&nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if($conexion-&gt;IsConnected)<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; $conexion-&gt;Close();<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; } &nbsp;&nbsp; &nbsp;&nbsp; <br>
&nbsp;&nbsp;&nbsp; }<br>
<br>
?&gt;<br>
<br>
&lt;!-- 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>
--&gt;<br>
<br>
N&oacute;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&oacute;n no persistente que est&eacute;
abierta, en vez de estar abriendo y cerrando. Esto para m&iacute; tambi&eacute;n es
llamado pooling, pero b&aacute;sico, y aunque no sea un proceso automatizado,
as&iacute; es como trabaja... La idea es siempre tener una y s&oacute;lo una conexi&oacute;n
disponible cuando la usemos sin tener que abrirla m&aacute;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&aacute;ndolos en otra p&aacute;gina. La
cerramos para liberar recursos y as&iacute; optimizamos cualquier cantidad de
memoria. Esta clase de pooling no comparte conexiones entre procesos
(para m&iacute; un proceso tiene un PID y tiene un destino distinto).<br>
<br>
&lt;!-- sql.php --&gt;<br>
&lt;?php<br>
&nbsp;&nbsp;&nbsp; require_once 'conexion.php';<br>
<br>
&nbsp;&nbsp;&nbsp; // una funcion que lo unico que hace es retornar el recordset.<br>
&nbsp;&nbsp;&nbsp; function buscar_alumno($rut)<br>
&nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(!$conexion-&gt;IsConnected || !isset($conexion))<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; abrir_conexion();<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; }<br>
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; $sql = $conexion-&gt;Prepare("SELECT * FROM alumno WHERE
rut_alumno = ?");<br>
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; $rs = $conexion-&gt;Execute($sql,array($rut));<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; return $rs;<br>
&nbsp;&nbsp;&nbsp; }<br>
<br>
&nbsp;&nbsp;&nbsp; // una funcion que lo unico que hace es retornar el recordset.<br>
&nbsp;&nbsp;&nbsp; function buscar_apoderado($rut)<br>
&nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(!$conexion-&gt;IsConnected || !isset($conexion))<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; abrir_conexion();<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; }<br>
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; $sql = $conexion-&gt;Prepare("SELECT * FROM apoderado WHERE
rut_alumno = ?");<br>
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; $rs = $conexion-&gt;Execute($sql,array($rut));<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; return $rs;<br>
&nbsp;&nbsp;&nbsp; }<br>
<br>
&nbsp;&nbsp;&nbsp; // una funcion que lo unico que hace es retornar el recordset.<br>
&nbsp;&nbsp;&nbsp; function buscar_cuotas($rut)<br>
&nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; si la conexi&oacute;n no existe, o no se ha seteado, entonces abrimos
la conexion. Si la conexion existe, para que?<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(!$conexion-&gt;IsConnected || !isset($conexion))<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; abrir_conexion();<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; $sql = $conexion-&gt;Prepare("SELECT * FROM cuotas WHERE
rut_alumno = ?");<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; $rs = $conexion-&gt;Execute($sql,array($rut));<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return $rs;<br>
&nbsp;&nbsp;&nbsp; }<br>
?&gt;<br>
<br>
&lt;!-- bussiness.php --&gt;<br>
&lt;?php<br>
&nbsp;&nbsp;&nbsp; require_once 'conexion.php';<br>
&nbsp;&nbsp;&nbsp; require_once 'sql.php';<br>
<br>
&nbsp;&nbsp;&nbsp; // abrimos la conexion();<br>
&nbsp;&nbsp;&nbsp; abrir_conexion();<br>
<br>
&nbsp;&nbsp;&nbsp; // procesamos algunas cosas...<br>
&nbsp;&nbsp;&nbsp; dibujemos();<br>
<br>
&nbsp;&nbsp;&nbsp; // llamamos a nuestra consulta.<br>
&nbsp;&nbsp;&nbsp; // esto ya es l&oacute;gica de negocios, &iquest;no? &nbsp; <br>
&nbsp;&nbsp;&nbsp; $resultado1 = buscar_alumno($rut);<br>
<br>
&nbsp;&nbsp;&nbsp; // tururururu, me gusta cantar...<br>
&nbsp;&nbsp;&nbsp; juguemos_en_el_bosque();<br>
<br>
&nbsp;&nbsp;&nbsp; // nuestra logica de negocios requiere que<br>
&nbsp;&nbsp;&nbsp; // busquemos al responsable por el cabro de ... ;)<br>
&nbsp;&nbsp;&nbsp; $resultado2 = buscar_apoderado($rut);<br>
<br>
&nbsp;&nbsp;&nbsp; // el lobo andaba comi&eacute;ndose unas abuelitas por ahi<br>
&nbsp;&nbsp;&nbsp; mientras_el_lobo_no_esta();<br>
<br>
&nbsp;&nbsp;&nbsp; // de nuevo, no necesitamos de SQL feos por ahi...<br>
&nbsp;&nbsp;&nbsp; $resultado3 = buscar_cuotas($rut);<br>
<br>
&nbsp;&nbsp;&nbsp; // mostramos los resultados en la pantalla...<br>
&nbsp;&nbsp;&nbsp; lobo_esta(?);<br>
<br>
&nbsp;&nbsp;&nbsp; // cerramos la conexion...<br>
&nbsp;&nbsp;&nbsp; cerrar_conexion();<br>
<br>
&nbsp;&nbsp;&nbsp; // cerramos algunas otras cosillas, o bien cargamos el footer, que
se yo,<br>
&nbsp;&nbsp;&nbsp; terminado();<br>
<br>
&nbsp;&nbsp;&nbsp; // una vieja costumbre m&iacute;a, heredada de los antiguos BASIC de ATARI.<br>
&nbsp;&nbsp;&nbsp; // nadie me ha convencido de que esto no es necesario<br>
&nbsp;&nbsp;&nbsp; exit();<br>
?&gt;<br>
<br>
Como puedes ver, finalmente son m&aacute;s archivos, pero el que te interesa
que es la l&oacute;gica de negocios, te queda lindo para leer. La cosa es
dise&ntilde;ar un poco m&aacute;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&oacute;gica de presentaci&oacute;n necesita que la l&oacute;gica de negocios le pase
datos, y la l&oacute;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&eacute;) 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>