<!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">
Hola:<br>
<blockquote
 cite="mid7eccce0d0602091211j75fbd143m91d84193deb0d72@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;"><span
 class="q">Estoy implementando un sistema de registro de alumnos en
PHP5 /
Postgres con tres capas, no estoy utilizando ningun framework o uno de
esos otros chiches <img moz-do-not-send="true" alt=""
 title="de acuerdo" border="0">
(quisiera toparme con estos problemillas primero). Mi consulta radica
en la forma en que hago mis conexiones de base datos, si bien es cierto
hay q dejar todo el peso de las conexiones a la capa de persistencia de
datos, esto hace q abra y cierre las conexiones a cada rato.<br>
Por ejemplo en el caso de cargar un objeto alumno haria:<br>
    </span>
    <div style="margin: 5px 20px 20px;">
    <div style="margin-bottom: 2px;">C&oacute;digo PHP:</div>
    <div
 style="border: 1px inset ; margin: 0px; padding: 6px; overflow: auto; width: 640px;">
    <code style="white-space: nowrap;"> </code><span class="q">
    <div style="text-align: left;" dir="ltr"> <code><font
 color="#000000">&nbsp;<font color="#007700" size="4">function&nbsp;</font><font
 color="#0000bb" size="4">buscarAlumno</font><font color="#007700"
 size="4">(</font><font color="#0000bb" size="4">
$codigo</font><font color="#007700" size="4">){<br>
&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000bb" size="4">$con&nbsp;</font><font
 color="#007700" size="4">=&nbsp;new&nbsp;</font><font color="#0000bb" size="4">Conexion</font><font
 color="#007700" size="4">
();<br>
&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000bb" size="4">$con</font><font
 color="#007700" size="4">-&gt;</font><font color="#0000bb" size="4">conectarse</font><font
 color="#007700" size="4">();<br>
    <br>
&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#ff8000" size="4">
//&nbsp;hago&nbsp;mi&nbsp;consulta<br>
&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000bb" size="4">$con</font><font
 color="#007700" size="4">-&gt;</font><font color="#0000bb" size="4">query</font><font
 color="#007700" size="4">(</font><font color="#0000bb" size="4">
$sql</font><font color="#007700" size="4">)<br>
    <br>
&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000bb" size="4">$alumno&nbsp;</font><font
 color="#007700" size="4">=&nbsp;new&nbsp;</font><font color="#0000bb" size="4">Alumno</font><font
 color="#007700" size="4">
();&nbsp;&nbsp;&nbsp;&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000bb" size="4">$alumno</font><font
 color="#007700" size="4">-&gt;</font><font color="#0000bb" size="4">colegio&nbsp;</font><font
 color="#007700" size="4">=&nbsp;</font><font color="#0000bb" size="4">
Colegio</font><font color="#007700" size="4">::</font><font
 color="#0000bb" size="4">buscarColegio</font><font color="#007700"
 size="4">(</font><font color="#0000bb" size="4">$data</font><font
 color="#007700" size="4">[</font>
    <font color="#dd0000" size="4">"cod_colegio"</font><font
 color="#007700" size="4">]);<br>
&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#ff8000" size="4">//este&nbsp;metodo&nbsp;internamente&nbsp;tambien&nbsp;abre&nbsp;y&nbsp;cierra&nbsp;una&nbsp;conexion;<br>
&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000bb" size="4">
$alumno</font><font color="#007700" size="4">-&gt;</font><font
 color="#0000bb" size="4">ciudad&nbsp;</font><font color="#007700" size="4">=&nbsp;</font><font
 color="#0000bb" size="4">Colegio</font><font color="#007700" size="4">::
    </font>
    <font color="#0000bb" size="4">buscarCiudad</font><font
 color="#007700" size="4">(</font><font color="#0000bb" size="4">$data</font><font
 color="#007700" size="4">[</font><font color="#dd0000" size="4">"cod_ciudad"
    </font><font color="#007700" size="4">]);<br>
&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#ff8000" size="4">//esta&nbsp;tambien<br>
&nbsp;&nbsp;&nbsp;&nbsp;//...&nbsp;y&nbsp;cuantas&nbsp;tuviera<br>
    <br>
&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000bb" size="4">$con</font><font
 color="#007700" size="4">
-&gt;</font><font color="#0000bb" size="4">cerrar_conexion</font><font
 color="#007700" size="4">();<br>
&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#ff8000" size="4">//&nbsp;cerramos&nbsp;la&nbsp;conexion&nbsp;de&nbsp;al&nbsp;inicio<br>
&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#007700" size="4">
return&nbsp;</font><font color="#0000bb" size="4">$alumno</font><font
 color="#007700"><font size="4">;<br>
}&nbsp;
    </font></font></font></code></div>
    </span></div>
    </div>
  </blockquote>
  <div>KATE O KWRITE :P<br>
  <br>
  </div>
  </div>
</blockquote>
&iquest;A qu&eacute; viene eso?<br>
<blockquote
 cite="mid7eccce0d0602091211j75fbd143m91d84193deb0d72@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;"><span
 class="q">Esto abriria y cerraria muchas conexiones por lo q
reventaria el limite de estas.</span></blockquote>
  <div><br>
depende si estas tu motor de base de datos soporta conexiones
persistentes y no cierras las conexiones no deberia reventar<br>
  </div>
  </div>
</blockquote>
PostgreSQL s&iacute; soporta conexiones persistentes. Simplemente tienes que
modificar algunas cosas. Creo que tu pregunta es m&aacute;s sencilla de
resolver que lo que se ve en el correo.<br>
<br>
voy a hacer un peque&ntilde;o pseudoc&oacute;digo (ando con jaquecas hoy) que te gu&iacute;e.<br>
<br>
&lt;?php<br>
<br>
&nbsp;&nbsp;&nbsp; function buscar_colegio()<br>
&nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(!conexion-&gt;abierta)<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; abrir_conexion();<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; codigoparabuscar-&gt;colegio;<br>
&nbsp;&nbsp;&nbsp; }<br>
<br>
&nbsp;&nbsp;&nbsp; function buscaralumno()<br>
&nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; abrir_conexion();<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; alumno = new alumno();<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; buscar_colegio();<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; buscar_ciudad();<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return alumno();<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; cerrar_conexion();<br>
&nbsp;&nbsp;&nbsp; }<br>
<br>
?&gt;<br>
<br>
Aunque PHP al finalizar el script cierra las conexiones y libera la
basura, yo personalmente recomiendo cerrar las conexiones puesto que el
garbage collector igual ocupa algo m&aacute;s de memoria, pues debe "adivinar"
qu&eacute; cosas est&aacute;n abiertas. Aqui solamente abres una conexion aparte si
no hay ninguna conexi&oacute;n abierta, lo cual quiere decir que te ahorras
una conexi&oacute;n a la base de datos por cada vez que con el esquema
anterior tienes problemas. ;)<br>
<br>
<blockquote
 cite="mid7eccce0d0602091211j75fbd143m91d84193deb0d72@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;"><span
 class="q">Otro caso es este:<br>
    </span>
    <div style="margin: 5px 20px 20px;">
    <div style="margin-bottom: 2px;">C&oacute;digo PHP:</div>
    <div
 style="border: 1px inset ; margin: 0px; padding: 6px; overflow: auto; width: 640px;">
    <code style="white-space: nowrap;"> </code>
    <div style="text-align: left;" dir="ltr"> <code><font
 color="#000000"><span class="q"><font color="#007700"><br>
    <font size="4">function&nbsp;</font></font><font color="#0000bb" size="4">buscarAlumno</font><font
 color="#007700" size="4">(</font><font color="#0000bb" size="4">
$con</font>
    <font color="#007700" size="4">,</font><font color="#0000bb"
 size="4">$codigo</font><font color="#007700" size="4">){<br>
&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000bb" size="4">$alumno&nbsp;</font><font
 color="#007700" size="4">=&nbsp;new&nbsp;</font>
    <font color="#0000bb" size="4">Alumno</font><font color="#007700"
 size="4">();<br>
&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#ff8000" size="4">//&nbsp;hago&nbsp;mi&nbsp;consulta<br>
&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000bb" size="4">$con</font><font
 color="#007700" size="4">
-&gt;</font><font color="#0000bb" size="4">query</font><font
 color="#007700" size="4">(</font><font color="#0000bb" size="4">$sql</font><font
 color="#007700" size="4">)<br>
&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000bb" size="4">$alumno
    </font><font color="#007700" size="4">-&gt;</font><font
 color="#0000bb" size="4">colegio&nbsp;</font><font color="#007700" size="4">=&nbsp;</font><font
 color="#0000bb" size="4">Colegio</font><font color="#007700" size="4">::</font>
    <font color="#0000bb" size="4">buscarColegio</font><font
 color="#007700" size="4">(</font><font color="#0000bb" size="4">$con</font><font
 color="#007700" size="4">,</font><font color="#0000bb" size="4">$data</font><font
 color="#007700" size="4">
[</font><font color="#dd0000" size="4">"cod_colegio"</font><font
 color="#007700" size="4">]);<br>
&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#ff8000" size="4">//usa&nbsp;la&nbsp;conexion&nbsp;ya&nbsp;disponible;<br>
&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000bb" size="4">
$alumno</font><font color="#007700" size="4">-&gt;</font><font
 color="#0000bb" size="4">ciudad&nbsp;</font><font color="#007700" size="4">=&nbsp;</font><font
 color="#0000bb" size="4">Colegio</font><font color="#007700" size="4">::
    </font>
    <font color="#0000bb" size="4">buscarCiudad</font><font
 color="#007700" size="4">(</font><font color="#0000bb" size="4">$con</font><font
 color="#007700" size="4">,</font><font color="#0000bb" size="4">$data</font><font
 color="#007700" size="4">
[</font><font color="#dd0000" size="4">"cod_ciudad"</font><font
 color="#007700" size="4">]);<br>
&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#ff8000" size="4">//este&nbsp;tambien<br>
&nbsp;&nbsp;&nbsp;&nbsp;//...&nbsp;y&nbsp;cuantas&nbsp;tuviera<br>
    <br>
&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#007700" size="4">
return&nbsp;</font><font color="#0000bb" size="4">$alumno</font><font
 color="#007700"><font size="4">;<br>
}&nbsp;
    </font><br>
    </font></span></font>
    </code> </div>
    </div>
    </div>
    <div><span class="e" id="q_1094bc3164cb2e76_9"><br>
Aqui mando mi conexion abierta desde fuera, pero esto haria que el que
abra mi conexion sea mi capa de logica de negocio, pero supuestamente
esta no deber&iacute;a ser su funcion, ademas imaginemos q el metodo de la
capa de logica sea un poco extensa, la conexion estaria abierta mucho
tiempo, y eso tambien acarrearia problemas.<br>
La pregunta del millon es esta... <br>
&iquest;Cual de las dos formas es la mas optima a utilizar?</span></div>
  </blockquote>
  <div><br>
mmm no me convence ninguna<br>
  </div>
  </div>
</blockquote>
A m&iacute; tampoco me convence ninguna. Veo que est&aacute;s tratando las tres capas
como algo totalmente separado, cuando en verdad es algo com&uacute;n que en
algunas partes se junten. El concepto de N-Tier, seg&uacute;n como yo lo
entiendo, te da la capacidad de modelar/programar un problema en varias
capas, pero en ninguna parte dice que est&aacute;n completamente inconexas.<br>
<br>
Ahora, si en vez de abrir_conexion(); usas mysql_connect(); en la capa
de negocios... claro que est&aacute; malo, pues vas a tener que t&uacute; mismo
validar que la conexi&oacute;n se abra bien, que el nombre de usuario, que la
password, etc. Una buena capa de manejo de datos est&aacute; dada (como
siempre digo) por adodb y MDB2 que es parte de PEAR.<br>
<blockquote
 cite="mid7eccce0d0602091211j75fbd143m91d84193deb0d72@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;">
    <div><span class="e" id="q_1094bc3164cb2e76_9">&iquest;Existe una tercera
forma?</span></div>
  </blockquote>
  <div><br>
si y una cuarta y una quinta....etc<br>
  <br>
  </div>
  </div>
</blockquote>
Siempre existe m&aacute;s de una forma de resolver estos problemas. De hecho,
con AJAX :P<br>
<blockquote
 cite="mid7eccce0d0602091211j75fbd143m91d84193deb0d72@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;">
    <div><span class="e" id="q_1094bc3164cb2e76_9">&iquest;Que hay de los pool
de conexiones.. me comentaban que evitaban estos problemas?</span></div>
  </blockquote>
  <div><br>
No me suena, pero.... <br>
  </div>
  <br>
  </div>
</blockquote>
El pool de conexiones es "parecido" a las conexiones persistentes. A&uacute;n
cuando no hagas conexiones persistentes, un pool de conexi&oacute;n te permite
utilizar una sola conexi&oacute;n y abrirla/cerrarla cuando haces operaciones.
Es algo intermedio entre conexiones open/close y persistentes. La
conexi&oacute;n pool te queda abierta pero no procesando datos, sino que queda
en modo de lock para que cuando abras otra conexion se utilice la misma
y no una segunda o una tercera.<br>
<br>
<blockquote
 cite="mid7eccce0d0602091211j75fbd143m91d84193deb0d72@mail.gmail.com"
 type="cite">
  <div>
  <div>Utiliza clases de acceso a datos (onda class ColegioDAO) y que
estos
DAOs sea los encargados de abrir(no de cerrar) conexiones con la base
de datos. La idea es que estos DAOs se comuniquen con algun
DAOConnector.php y en este archivo se abran las conexiones a la base de
datos(o las bases de datos), asi como tambien almacenar cualquier
configuracion adicional de conexion este en DAOConnector. De esta
manera la capa de negocios solamente se entendera con los DAOs y ellos
ver&aacute;n como obtienen los datos y los empaquetaran en los Beans(crea unos
Beans(onda class ColegioBean) que tenga sus getters y setters(no se si
esta bien escrito) y que estos sean los encargados de llevar la
informacion empaquetada)<br>
  </div>
  </div>
</blockquote>
No crees tu capa de abstracci&oacute;n de datos t&uacute; mismo, no reinventes la
rueda: ya hay unos bastante buenos, como adodb y MDB2, que ya hab&iacute;a
mencionado. (adodb.sourceforge.net). A pesar de que hay a quien no le
gusta c&oacute;mo programa el creador de adodb, la clase hace su pega y la
hace bien. Aparte el sistema te queda bastante portable a Oracle,
Access, SQL Server, MySQL, SQLite y otros... (quien va a usar PHP con
SQL Server? bueno no falta el ... personaje)<br>
<br>
<blockquote
 cite="mid7eccce0d0602091211j75fbd143m91d84193deb0d72@mail.gmail.com"
 type="cite">
  <div>
  <div>Ahora bien... PHP automaticamente liberar&aacute; todos los resources
que no
se esten ocupando al finalizar el script por lo que no es necesario
cerrar las conexiones a las bases de datos(con conexiones persistentes)
PHP se encargar&aacute; cuando sea necesario(algo asi como un recolector de
basura de JAVA)<br>
  </div>
  </div>
</blockquote>
Nunca he confiado en GC... prefiero pegarme el trabajo yo solito, si es
una linea (mysql_close($conexion);) ;)<br>
<blockquote
 cite="mid7eccce0d0602091211j75fbd143m91d84193deb0d72@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;">
    <div><span class="e" id="q_1094bc3164cb2e76_9">Esto ultimo no lo he
investigado<br>
Agredecere cualquier colaboracion.<br>
-- <br>
Juan Pablo
    </span></div>
  </blockquote>
  </div>
  <br>
saludos!<br clear="all">
  <br>
-- <br>
Julio
Araya
C.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
Linux User #386141<br>
Estudiante de Ingenier&iacute;a Civil Informatica&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Valparaiso - Chile<br>
Universidad Tecnica Federico Santa Maria<br>
  <a href="http://www.alumnos.utfsm.cl/%7Ejulio.araya">http://www.alumnos.utfsm.cl/~julio.araya
  </a><br>
  <a href="http://www.arriendocasas.cl">http://www.arriendocasas.cl</a><br>
</blockquote>
<br>
</body>
</html>