ralentización Java.

Iniciado por miguel_mota, 20 Enero 2011, 11:04 AM

0 Miembros y 1 Visitante están viendo este tema.

miguel_mota

Hola, en primer lugar me presento, ya que soy nuevo en el foro. Me llamo Miguel soy Ingeniero Técnico en Informática.

Llevo unos 9 meses desarrollando una aplicación Java con NetBeans.
Es una aplicación de gestión de clientes, facturación, presupuestos, etc. Utiliza una BD de Access y la conecto con un driver JDBC-ODBC.
Os podeis imaginar que si llevo 9 meses desarrollando la aplicación a pleno rendimiento, es una aplicación bastante abultada...
Pero tengo un problema muy grande, y estoy desesperado. La aplicación cuando la ejecuto desde de Netbeans corre muy bien y rápida. Pero cuando la ejecuto desde el .jar o desde consola la aplicación se vuelve muy torpe, se queda pillada en las consultas a la base de datos, en las iteraciones a las linkedList,... en resumen que estoy jodido...
He probado a ejecutarla con eclipse pero le pasa lo mismo, va muy lenta.

No se que hacer ya. Ha alguno le ha ocurrido algo parecido?

Gracias de antemano.

kasiko

yo creo deberias mirar las optimizaciones de compilacion de java y runtime
Nos vemos...


sapito169

En primer lugar tienes que saber con lujos de detalles se produce el error

-que línea de que método de que clase se produce los problemas si lanza una excepción cual excepción especifica y después de que circunstancia especifica se produce el problema que valores específicos recibe de entrada antes de que se produzca el problema
-bajo qué circunstancias especificas se produce el problema sistema operativo versión de la maquina virtual hardaware usuario después de que acción comienza después de abrir que ventana comienza a qué hora que del día cuan grande es la base de datos cuantos usuarios ingresan

el ide no  tiene absolutamente nada que ver

No basta con quejarse y decir que va lento tienes que conocer muy afondo tu sistema
   
Tienes que tener un conocimiento de cómo funciona tu programa hasta el más mínimo detalle

-tienes que saber exactamente cuantas instancias de conexiones tienes cuantas están abiertas cuantas estas cerradas cuando las cierras cuando las abres si es lógico cuando las cierras y cuando las abres
-cuantas instancias de formularios tienes como liberas sus recursos creas formularios o reutilizas los creados


Siempre están tan equivocados y tan perdidos jamas te quejes de un sistema (eso no sirve para nada) quéjate de una especifica pequeñísima parte bajo tal especifica circunstancia bajo tal ingreso de datos


Si no hablas con lujos de detalle (de que línea de que método de que clase específicamente después de que bajo que circunstancia) lo único que puedo hacer es una hipótesis y luego tendrás que comprobarlo (de manera medible y repetible detesto lo subjetivo) es decir jugar a apostar en la ruleta rusa

Primera hipótesis el manejo de las conexiones a la base de datos es muy pobre creas cientos de conexiones (tal vez dentro de un bucle) después de algún evento sin sentido (abrir ventana mostrar una grilla cuando se hace visible algo) y jamas liberas la conexión y se queda abierta para nunca ser usada
   
Otra hipótesis es que el rendimiento de acces con java de por si es malo en cualquier tipo de aplicación que tenga la misma combinación de cantidad de usuarios simultáneos y hardware que tu usas

miguel_mota

Muchas gracias por tu extensa respuesta. El fallo surge cuando la aplicación lleva un rato funcionando, y se han hecho varias consultas a la base de datos. No falla en un sitio en concreto.
Las consulta a la base de datos las hago de la siguiente manera: tengo una clases a las que llamo repositorios todas con un método open() y un método close(), en esas clases están todos los métodos de las consultas. Puede radicar el problema en tener tantas conexione con la BD?, es decir por ejemplo tengo una clase clientesRepository donde están todos los métodos para trabajar con la BD y los clientes, al open de esta clase solo lo llamo una vez y lo mantengo abierto. El problema puede estar en que puedo tener como unos 15 o 20 clases de ese tipo.

Lo del IDE lo he dicho, porque es muy curioso que ejecutándolo desde Netbeans nunca me ha dado problemas de esa índole. Y cuando ya iba muy avanzado el proyecto y el cliente ya tenia una primera versión fue cuando surgieron esos tipos de problemas.

Muchas gracias de nuevo.

sapito169

-desinstala netbeans(es solo una broma)
-borrar todas las variables globales estáticas
-pon todas las dependencias de tus clases en el constructor
-crea toda la aplicación desde el método main

Te debe quedar algo así



public class Main{
public static void main(String arg[]){
BasicDataSource basicDataSource = new BasicDataSource();

basicDataSource.setDriverClassName("com.mysql.jdbc.Driver");
basicDataSource.setUrl("jdbc:mysql://localhost:3306/nombre_bd");
basicDataSource.setUsername("usuario");
basicDataSource.setPassword("password");

RepositorioFactura repositorioFactura =new RepositorioFactura(basicDataSource);
RepositorioProductos repsoitoriProductos=new RepsoitoriProductos(basicDataSource);
RepositorioFormasDePago repositorioFormasDePago=new RepositorioFormasDePago(basicDataSource);
RepositorioCliente repositorioCliente=new RepositorioCliente(basicDataSource);

ControladorFactura controladorFactura =new ControladorFactura(repositorioFactura,repsoitoriProductos,repositorioFormasDePago,repositorioCliente);
FrmFactura frmFactura =new FrmFactura(controladorFactura);

............
FrmPrincipal frmPrincipal =new FrmPrincipal(frmFactura,........);
............

frmPrincipal.setVisible(true);
}

}


   
Todas las clases que sean pesadas (Repositorios ) deben tener método un método close o liberar recursos donde sierran las conexiones y debes llamarla en un lugar coherente es decir cuando no las uses

nota que ahora puedes controlar tu aplicación al mínimo y además estas usando un pool de conexiones

http://chuwiki.chuidiang.org/index.php?title=Pool_de_conexiones

miguel_mota

Mil gracias sapito, creo con eso solucionaría mis problemas.
Ya te comento como sale todo cuando lo implemente.

Un abrazo y gracias de nuevo.