Duda al cargar atributos desde una BD.

Hola.
Tengo varias clases java que al ser instanciadas cargan todos sus atributos con valores extraídos de una BD y me han surgido varias dudas de cara a minimizar los accesos a la BD:
1- ¿Sería recomendable cargar solo éstos valores cuando vayan a ser utilizados por primera vez (típicamente a través de un get invocado por una tercera clase) o es mejor cargarlos todos desde el inicio?
2- ¿Qué resultaría mejor: cargar todos los valores de atributos posibles mediante una consulta simple a la hora de cargar uno de ellos o cargar solo el atributo implicado (necesitándose tal vez más consultas más adelante en caso de querer acceder a otros atributos)?
Gracias y un saludo.
Respuesta
1
1)
Está claro que es mejor minimizar accesos a BD, pero en este mundo no sirve todo para todos los casos. Por ejemplo, si tienes una aplicación pequeña del orden 500 usuarios con 20 accediendo a la vez, pues la verdad es que cargando todos los valores desde el principio para todos los Beans no vas a notar diferencia alguna. En cambio, si tienes una aplicación muy grande, del orden de 10.000 usuarios accediendo a la vez no te interesa tener todos sus datos cargados en el contexto de memoria si las clases de estos usuarios son considerablemente grandes.
En este caso, esto no significa que tengas que acceder a cada dato por primera vez cada vez que lo necesites, por eso te recomendaría que te hicieras algún sistema con el que los atributos más importantes se carguen siempre, y los opcionales que no se usan en todas las ventanas/pantallas, se carguen cuando lo necesiten. Al igual que a lo mejor necesitas que unas clases concretas se carguen todos sus datos siempre (como Países, Provincias y datos comunes) porque en principio variará muy poco.
2)
Para todo esto hay que tener claro la relación Tiempo-Espacio. La Entrada/Salida ya se sabe que es muchísimo más lenta que un acceso a memoria y por tanto hay que intentar minimizar éstas. Cada vez que haces una consulta se abre y se cierra sesión . Veámoslo con un ejemplo:
Tienes 1 clase con 20 atributos y 1000 instancias esperando a cargar datos de la base de datos en el momento preciso. Supongamos un acceso a BD que tarda 0.005 segundos en abrir sesión y el tiempo de transferencia es negligible. Podemos ver fácilmente que cargar datos de 1000 instancias, con 1 consulta para cada una tardaríamos 5 segundos en cargar todos los datos. En cambio si hiciéramos 1 consulta para cada atributo para cada instancia, tardaríamos 100 segundos. Parece una bestialidad, y lo es. Estaría claro que no cargaríamos todos los datos uno tras otro, pero de una forma acumulada y prolongada, el servidor acabaría estando 20 veces más tiempo haciendo consultas que si se cargara el bean entero. También hay que mirar el espacio, en el primer caso, supongamos una media de 4 bytes por cada atributo, cada clase ocupa 80 bytes en memoria con todos sus datos cargados. En el primer caso al acabar de cargar todo, tendríamos en memoria 1.5 MB de datos sólo para los usuarios, en cambio, si solo cargáramos los atributos 1 a 1 suponiendo que cada clase tiene una media 2 atributos que forman parte de su clave primaria en la BD, tendríamos que al cargar las clases con sus atributos más importantes en memoria, 156 KB.
Deberías hacer un estudio tal y como he hecho yo ahora y valorar qué te va mejor. Quizás incluso te podrías hacer alguna gráfica si no lo tuvieras muy claro y visualmente podrías verlo mejor.
Si necesitas más ayuda no necesites en consultar ;)
Quería decir que si necesitas más ayuda no dudes en consultar, :p

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas