<!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ó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"> <font color="#007700" size="4">function </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>
</font><font color="#0000bb" size="4">$con </font><font
color="#007700" size="4">= new </font><font color="#0000bb" size="4">Conexion</font><font
color="#007700" size="4">
();<br>
</font><font color="#0000bb" size="4">$con</font><font
color="#007700" size="4">-></font><font color="#0000bb" size="4">conectarse</font><font
color="#007700" size="4">();<br>
<br>
</font><font color="#ff8000" size="4">
// hago mi consulta<br>
</font><font color="#0000bb" size="4">$con</font><font
color="#007700" size="4">-></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>
</font><font color="#0000bb" size="4">$alumno </font><font
color="#007700" size="4">= new </font><font color="#0000bb" size="4">Alumno</font><font
color="#007700" size="4">
(); <br>
</font><font color="#0000bb" size="4">$alumno</font><font
color="#007700" size="4">-></font><font color="#0000bb" size="4">colegio </font><font
color="#007700" size="4">= </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>
</font><font color="#ff8000" size="4">//este metodo internamente tambien abre y cierra una conexion;<br>
</font><font color="#0000bb" size="4">
$alumno</font><font color="#007700" size="4">-></font><font
color="#0000bb" size="4">ciudad </font><font color="#007700" size="4">= </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>
</font><font color="#ff8000" size="4">//esta tambien<br>
//... y cuantas tuviera<br>
<br>
</font><font color="#0000bb" size="4">$con</font><font
color="#007700" size="4">
-></font><font color="#0000bb" size="4">cerrar_conexion</font><font
color="#007700" size="4">();<br>
</font><font color="#ff8000" size="4">// cerramos la conexion de al inicio<br>
</font><font color="#007700" size="4">
return </font><font color="#0000bb" size="4">$alumno</font><font
color="#007700"><font size="4">;<br>
}
</font></font></font></code></div>
</span></div>
</div>
</blockquote>
<div>KATE O KWRITE :P<br>
<br>
</div>
</div>
</blockquote>
¿A qué 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í soporta conexiones persistentes. Simplemente tienes que
modificar algunas cosas. Creo que tu pregunta es más sencilla de
resolver que lo que se ve en el correo.<br>
<br>
voy a hacer un pequeño pseudocódigo (ando con jaquecas hoy) que te guíe.<br>
<br>
<?php<br>
<br>
function buscar_colegio()<br>
{<br>
if(!conexion->abierta)<br>
{<br>
abrir_conexion();<br>
}<br>
codigoparabuscar->colegio;<br>
}<br>
<br>
function buscaralumno()<br>
{<br>
abrir_conexion();<br>
alumno = new alumno();<br>
buscar_colegio();<br>
buscar_ciudad();<br>
return alumno();<br>
cerrar_conexion();<br>
}<br>
<br>
?><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ás de memoria, pues debe "adivinar"
qué cosas están abiertas. Aqui solamente abres una conexion aparte si
no hay ninguna conexión abierta, lo cual quiere decir que te ahorras
una conexió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ó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 </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>
</font><font color="#0000bb" size="4">$alumno </font><font
color="#007700" size="4">= new </font>
<font color="#0000bb" size="4">Alumno</font><font color="#007700"
size="4">();<br>
</font><font color="#ff8000" size="4">// hago mi consulta<br>
</font><font color="#0000bb" size="4">$con</font><font
color="#007700" size="4">
-></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>
</font><font color="#0000bb" size="4">$alumno
</font><font color="#007700" size="4">-></font><font
color="#0000bb" size="4">colegio </font><font color="#007700" size="4">= </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>
</font><font color="#ff8000" size="4">//usa la conexion ya disponible;<br>
</font><font color="#0000bb" size="4">
$alumno</font><font color="#007700" size="4">-></font><font
color="#0000bb" size="4">ciudad </font><font color="#007700" size="4">= </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>
</font><font color="#ff8000" size="4">//este tambien<br>
//... y cuantas tuviera<br>
<br>
</font><font color="#007700" size="4">
return </font><font color="#0000bb" size="4">$alumno</font><font
color="#007700"><font size="4">;<br>
}
</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í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>
¿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í tampoco me convence ninguna. Veo que estás tratando las tres capas
como algo totalmente separado, cuando en verdad es algo común que en
algunas partes se junten. El concepto de N-Tier, según como yo lo
entiendo, te da la capacidad de modelar/programar un problema en varias
capas, pero en ninguna parte dice que están completamente inconexas.<br>
<br>
Ahora, si en vez de abrir_conexion(); usas mysql_connect(); en la capa
de negocios... claro que está malo, pues vas a tener que tú mismo
validar que la conexión se abra bien, que el nombre de usuario, que la
password, etc. Una buena capa de manejo de datos está 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">¿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á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">¿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ún
cuando no hagas conexiones persistentes, un pool de conexión te permite
utilizar una sola conexión y abrirla/cerrarla cuando haces operaciones.
Es algo intermedio entre conexiones open/close y persistentes. La
conexió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á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ón de datos tú mismo, no reinventes la
rueda: ya hay unos bastante buenos, como adodb y MDB2, que ya había
mencionado. (adodb.sourceforge.net). A pesar de que hay a quien no le
gusta có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á 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á 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.
Linux User #386141<br>
Estudiante de Ingeniería Civil Informatica 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>