Foros del Web » Programando para Internet » PHP » Frameworks y PHP orientado a objetos »

Multiples objetos de conexion a la base de datos

Estas en el tema de Multiples objetos de conexion a la base de datos en el foro de Frameworks y PHP orientado a objetos en Foros del Web. Hola a todos, estoy desarrollando una clase muy sencilla que permita, a los usuarios usar un conjunto basicos de metodos para hacer consultas, creacion de ...
  #1 (permalink)  
Antiguo 28/05/2010, 14:33
Avatar de webness  
Fecha de Ingreso: enero-2009
Ubicación: BOGOTA
Mensajes: 312
Antigüedad: 15 años, 11 meses
Puntos: 5
Multiples objetos de conexion a la base de datos

Hola a todos, estoy desarrollando una clase muy sencilla que permita, a los usuarios usar un conjunto basicos de metodos para hacer consultas, creacion de arreglos de resultados, conexion, etc, usando metodos genericos sin importar el motor, por ahora esta solo hecho para Postgres y MySQL.

Haciendo una prueba en el codigo hice algo como esto

Código PHP:
<?
     
require "DBMS.php";
     
     
$db = new DBMS("confi.ini");
     
$db->connect();
     echo 
$db->getConnection();
?>
el metodo getConection devuelve el atributo $this->con, usado con mysql_connect o pg_connect.

puse a 2 usuarios a ejecutar este escript al mismo tiempo en maquinas distintas y el resultado fue el mismo:

Resource id#4

*Porque?, no se supone que cada request a este documento crea un hilo distinto, instancias distintas?

*Como hago para generar id distintos de conexion?.

estuve leyendo acerca de pool de conexiones pero no entendi mayor cosa, y los ejemplos me llevan a un singleton donde si no existe la conexion la cree y si existe use la ya existente, y yo necesito es que si existe cree otra hasta llegar a 30 y si no existe que cree una nueva
  #2 (permalink)  
Antiguo 28/05/2010, 14:57
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 15 años, 6 meses
Puntos: 1517
Respuesta: Multiples objetos de conexion a la base de datos

Sin ver lo que haz hecho no te podemos decir mucho. ¿Qué contiene el método getConnection()?
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos
  #3 (permalink)  
Antiguo 28/05/2010, 15:00
Avatar de webness  
Fecha de Ingreso: enero-2009
Ubicación: BOGOTA
Mensajes: 312
Antigüedad: 15 años, 11 meses
Puntos: 5
Respuesta: Multiples objetos de conexion a la base de datos

Código PHP:
Ver original
  1. public function getConnection()
  2. {
  3.      return $this->connection;
  4. }

previamente $this->connect ha sido inicializada con el valor devuelto por mysql_connect o pg_connect

---> BUScando en la pagina de php encontre que USANDO PGSQL_CONNECT_FORCE_NEW como segundo parametro del pg_connect, se puede lograr mi cometido, pero no entiendo todavia muy bien
  #4 (permalink)  
Antiguo 28/05/2010, 15:16
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años, 6 meses
Puntos: 2135
Respuesta: Multiples objetos de conexion a la base de datos

Los resource Ids como dice ahi son por request, es decir es el ID generado para cada objeto que es creado pero son independientes, no importa que ambos les de Resource ID#4, va a ser un objeto diferente para cada uno.

Saludos.
  #5 (permalink)  
Antiguo 28/05/2010, 15:23
Avatar de webness  
Fecha de Ingreso: enero-2009
Ubicación: BOGOTA
Mensajes: 312
Antigüedad: 15 años, 11 meses
Puntos: 5
Respuesta: Multiples objetos de conexion a la base de datos

Entonces podria decir que si 100 usuarios accden al tiempo, son 100 objetos con 100 conexiones distintas?.

que implicaciones a nivel de rendimiento tiene si me conecto a postgres asi

pg_connect($stringConnection,PGSQL_CONNECT_FORCE_N EW);

y a MYSQL asi:

mysql_query($server,$user,$pass,true);
  #6 (permalink)  
Antiguo 28/05/2010, 15:31
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años, 6 meses
Puntos: 2135
Respuesta: Multiples objetos de conexion a la base de datos

Recuerda que PHP es un lenguaje que se procesa en el servidor, y por ende esta "atado" al web server que lo maneje. A lo que voy con esto es que por cada request por lo general, el Web Server crea un thread independiente para manejar ese request, ese thread es el encargado de invocar el motor de PHP y ejecutar tu script PHP.

Entendiendo esto, puedes ver que cada script PHP se ejecuta en un ambiente aislado de otro thread, entonces las variables no se comparten, cada una esta en un espacio de memoria diferente.

Ahora, las bases de datos funcionan en un ambiente similar, ya que por lo general se conectan via TCP, tienen un "pool" de conexiones abiertas, y no importa que tu uses mysql_close o pg_close esto solo hace que marca la conexion como inactiva y es "cerrada" despues de un timeout.

Cuando tu desde PHP haces un request a un motor de BDD, este mira en su pool de conexiones para ver si tiene una conexion con el mismo user, mismo password y te regresa esa conexion, esto lo hace para ser mas optimo y no ocupar tanta memoria.

Entendiendo estos ambitos puedes ver que aunque desde PHP si entran 100 personas, te va a crear 100 objetos diferentes (cada uno en su espacio de memoria) pero puede que no sean 100 conexiones diferentes, ya que el manejador de la base de datos va a tratar de optimizar lo mas posible ese gasto de recursos, aunque como puedes ver las funciones pg_connect y mysql_connect pueden forzar el crear una conexion nueva, pero es tarea del motor de base de datos el seguir esto o reciclar una conexion.

Saludos.
  #7 (permalink)  
Antiguo 28/05/2010, 15:37
Avatar de webness  
Fecha de Ingreso: enero-2009
Ubicación: BOGOTA
Mensajes: 312
Antigüedad: 15 años, 11 meses
Puntos: 5
Respuesta: Multiples objetos de conexion a la base de datos

Ok lo de la parte del php ya la entendi a la perfección, pero ahora me pregunto esto:

¿que es mas optimo para la base de datos, 100 usuarios usando la misma conexion para insertar datos a la misma tabla, 0 100 usuarios con 100 conexiones distintas? todo esto en simultanea.


--->según mis averiguaciones es mejor tener muchas conexiones disponibles desde un inicio y que cada cliente haga uso de ellas y las devuelva. Lo que me genera un nuevo interrogante

¿En php que es mas recomendable entonces, poner el codigo de conexion al inicio de la navegacion del usuario y cerrar al final, el documento donde se hace el logout? o ¿decirle que se conecte cuando va a empezar un ciclo y de transacciones al inicio de un archivo y poner el codigo de cerrado al final de este archivo?, me explico

pg_connect

query 1

query 2

update

close

o es mejor usar mysql_pconnect y pg_pconnect

Última edición por webness; 28/05/2010 a las 16:03
  #8 (permalink)  
Antiguo 28/05/2010, 15:58
Avatar de webness  
Fecha de Ingreso: enero-2009
Ubicación: BOGOTA
Mensajes: 312
Antigüedad: 15 años, 11 meses
Puntos: 5
Respuesta: Multiples objetos de conexion a la base de datos

http://www.javamexico.org/blogs/ezam...he_dbcp_y_c3p0
  #9 (permalink)  
Antiguo 28/05/2010, 16:33
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 15 años, 6 meses
Puntos: 1517
Respuesta: Multiples objetos de conexion a la base de datos

Cita:
Iniciado por webness Ver Mensaje
¿que es mas optimo para la base de datos, 100 usuarios usando la misma conexion para insertar datos a la misma tabla, 0 100 usuarios con 100 conexiones distintas? todo esto en simultanea.
Si lo quieres lograr así debes entonces a cada usuario indicarle en el mysql_connect o en el pg_connect su propio usuario y cóntraseña (que no es lo recomendable porque para que sea optimo lo mejor es usar un solo usuario y una sola contraseña). A lo que se refiere GatorV no es que se maneje la misma información a través de la conexión, si no que PHP usa la misma conexión aunque tu tengas diferentes datos a subir a la base de datos. Es más bien una forma de PHP aligerar el proceso de transmitir los datos del código PHP a la base de datos. Pero en ese transcurso tu puedes estar enviando a la base de datos unos datos y yo estar enviando otros datos y lo que hará PHP es enviar la información a la base de datos y luego la base de datos se encarga de ir insertándolos/actualizando/borrando en el orden en que fueron recibidos.

Cita:
Iniciado por webness Ver Mensaje
¿En php que es mas recomendable entonces, poner el codigo de conexion al inicio de la navegacion del usuario y cerrar al final, el documento donde se hace el logout? o ¿decirle que se conecte cuando va a empezar un ciclo y de transacciones al inicio de un archivo y poner el codigo de cerrado al final de este archivo?
Eso va a depender de ti. Yo por lo general si sé que en la página voy a estar conectándome a la base de datos lo que hago es iniciarlo al principio del documento y luego donde la necesite. No es necesario cerrar la conexión al final del código ya que PHP se encarga de cerrarla por ti, por medio de sus "garbage collectors". Las conexiones no se mantienen abiertas una vez haya terminado el código y luego cerrarla en otro lugar, las conexiones siempre se cierran una vez termine el código a causa del "garbage collectors" (o mejor dicho entran al "time-out" que indicó GatorV.
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos
  #10 (permalink)  
Antiguo 28/05/2010, 22:04
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años, 6 meses
Puntos: 2135
Respuesta: Multiples objetos de conexion a la base de datos

Lo más recomendable para sitios pequeños es usar conexiones normales y dejar al servidor de MySQL cerrarlas, cuando son sitios de alto tráfico entonces es más recomendable cambiar a conexiones persistentes para agilizar el proceso de conexión con la base de datos.

Saludos.

Etiquetas: conexion, multiples, objetos
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 13:18.