Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General »

conexiones a bd

Estas en el tema de conexiones a bd en el foro de Bases de Datos General en Foros del Web. Hola, Me gustaría saber si es más rápido realizar desde código varias conexiones seguidas de pequeñas consultas cada una a la base de datos o ...
  #1 (permalink)  
Antiguo 02/09/2009, 05:55
 
Fecha de Ingreso: marzo-2008
Mensajes: 30
Antigüedad: 16 años, 1 mes
Puntos: 0
conexiones a bd

Hola,

Me gustaría saber si es más rápido realizar desde código varias conexiones
seguidas de pequeñas consultas cada una a la base de datos o es mejor
realizar una única conexión de una gran consulta.

Gracias
  #2 (permalink)  
Antiguo 02/09/2009, 05:56
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: conexiones a bd

A mi juicio te conviene manejar una sola conexión por sesion de usuario, y cerrarla solamente al terminar la sesión.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 03/09/2009, 00:01
 
Fecha de Ingreso: marzo-2008
Mensajes: 30
Antigüedad: 16 años, 1 mes
Puntos: 0
Respuesta: conexiones a bd

Me voy a explicar mejor.

Tengo una aplicación en asp Net. Para la obtención de un listado desde el
servidor tiene que realizar una consulta a la base de datos. Lo que no se
es si es mejor realizar una consulta a la base de datos por cada empleado
o realizar una única consulta para obtener los datos de todos los empleados.

Me gustaría saber cual de las opciones sería más óptima.

Gracias
  #4 (permalink)  
Antiguo 03/09/2009, 08:24
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: conexiones a bd

Siempre es mejor realizar la menor cantidad de consultas a la base, aunque en tu caso lo que hay que ver es el contexto de uso de los datos devueltos.
Para ser claro: Si vas a traer los 5341 empelados, para realizar tareas con 86, estás moviendo información inútilmente. No es eficiente y en definitiva también es un problema de seguridad.
La mejor idea es traer en una sola consulta todo lo que necesitas, porque de esa forma no necesitas ocupar enlaces innecesariamente. Ten en cuenta que para la base de datos devolverte 1 o 1.000 registros le puede llevar el mismo tiempo, y a la red transferírtelos también, pero realizar 86 pedidos de un empleado cada vez insume un overhead bastante alto en todos los niveles, sin contar con que entre uno y otro pedido pueden presentarse problemas de concurrencia.
El otro punto es que lo que pidas debe ser lo que realmente necesitas. No más. No Menos. Esto último quiere decir dos cosas:
1) Debes realizar la selección de empleados de modo que te devuelva solamente los que quieres.
2) No traigas más campos de la tabla que los que realmente vas a manejar. Esto significa: trata de evitar hacer un SELECT * FROM... Casi nunca necesitas eso.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #5 (permalink)  
Antiguo 03/09/2009, 23:45
 
Fecha de Ingreso: marzo-2008
Mensajes: 30
Antigüedad: 16 años, 1 mes
Puntos: 0
Respuesta: conexiones a bd

Hola,

Muchas gracias. Es como lo tengo hecho, en una única vez obtengo todos los datos, pero solo los necesarios. Lo que me gustaría es que me explicaras mejor
lo de el overhead y problemas de concurrencia, es para poder justificar lo que he hecho.

Gracias
  #6 (permalink)  
Antiguo 04/09/2009, 07:58
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: conexiones a bd

Overhead se considera, generalmente, como la combinación de excesos de tiempo, memoria, ancho de banda o cualquier otro recurso de computación necesario para obtener un resultado determinado. Estos tiempos pueden ser directos (los producidos por los procesos directamente implicados), o indirectos (producidos por procesos, acciones o características no directamente vinculadas al proceso específico).
En el case del overehad en este tipo de trabajos, estos pueden darse:
- Excesos de tiempo en el establecimiento de enlaces TCP/IP, tráfico en la red o usuarios conectados.
- Concurrencia de solicitudes o procesos.
- baja optimización de hardware o software, o bien su obsolecencia.
- Recursos limitados en el servidor, las computadoras implicadas o limitaciones de la propia LAN.
- Priorización de comunicaciones por jerarquía de usarios.
- Otros (muchos) m0tivos.

Uno de los motivos por los que se recomienda enfáticamente no crear constantemente conexiones, es debido a una particularidad de Windows: Windows no libera inmediatamente los recursos de conexión luego de ser usados. En lugar de eso pasa un largo tiempo en segundos o minutos en que la conexión cerrada en un enlace al servidor de BBDD todavía figura en el pool de conexiones como "usado". Esto hace que en un momento dado, si existe una ráfaga de conexiones demasiado elevada que se abren y cierran, el pool se encuentre lleno, siendo imposible realizar una solicitud por una conexión nueva, ya que no la admite por saturación.
Esto es un defecto de construcción del propio Windows y es salvable a través de ciertas técnicas.

La concurrencia se produce cuando dos o más usuarios intentan acceder al mismo recurso al mismo tiempo. El sistema sólo dejará que uno de ellos acceda, dejando al resto en espera en una cola.
En las bases de datos esto se da cuando dos o más usuarios quieren acceder a la misma tabla. No es posible admitir que los dos escriban o modifiquen la misma tabla al mismo tiempo, por lo que esto se debe controlar a través de transacciones o bien de bloqueos específicos.
Por otro lado, si uno accede para leer y otro para escribir, el primero puede estar leyendo datos que inmediatamente ya no existen o no son los mismos. Si esto sucede entre dos conexiones del mismo usuario y la primera es lectura y la segunda escritura, puede darse el caso de que en la segunda se intente escribir un registro que ha sido borrado por otro usuario entre las dos conexiones, puesto que realizó la acción entre ellas.
¿Se entiende?
Por ello es mejor realizar toda la tarea en una sola conexión, bloqueando las tablas para escritura cuando se está por realizar alguna modificación.

Hay mucho material en la web sobre estos temas.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
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 18:23.