GlassFish y Mysql

Buenos Noches. Saludos a todos.
Soy nuevo en este blog, y quisiera la ayuda en una aplicación Enterprise con java. Resulta que tengo una aplicación escritorio hecha en netbeans pero ha surgido la necesidad de que la aplicación este en varias sucursales, el problema es que la empresa no lo quiere pasar a web sino utilizar el mismo programa escritorio. Se me ocurrio montar glassfish en un servidor y crear un EJB para administrar las clases que manejan las transacciones. Hice lo debido. monte las librerias necesarias en mi aplicación escritorio para acceder a GlassFish al, agregué mi modulo EJB. y se conecta perfecto.

el problema está que cuando consulto información en mi base de datos en Mysql es demasiado lento incluso para las consultas mas simples.

Alguien me podria ayudar guiandome en lo que posiblemente puede estar pasando. se los agradesco de antermo.

Gracias.

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.

Optimizar Queries

Uno de los principales problemas que he visto muy seguido es que realizan Queries milagrosos que resuelven todo el negocio en una consulta, tu mencionas que hasta en los mas sencillos es muy lento. Hay que considerar que una base de datos también necesita tablas optimizadas de acuerdo a la carga que tendrán. Por ejemplo crear indices es algo que debe ser obligado en tablas grandes con un numero de consultas muy considerable eso sin olvidar que podemos agregar caché a las aplicaciones para evitar la latencia en la comunicación, búsqueda, etc.

Otra es ver como realizas las consultas, no vaya a ser que abres y cierras conexiones... vaya son muchos factores como lo pintas. Intenta hacer tus consultas desde un cliente de BD a ver si es tu app o tu BD.

Posibles causas de bajo rendimiento en consultas

1.- Misma aplicación,
2.- Misma base de datos,
3.- Servidor diferente

Síntomas:

Antes tenía buen rendimiento y ahora ¿es lento en las consultas?

No mencionas si la consulta sencilla que ves lenta ¿la haces desde la aplicación en una máquina diferente al servidor? o ¿desde un programa cliente de consultas también en una máquina diferente al server de b.d.?

Tampoco mencionas si el servidor de base de datos lo tienes junto el de aplicación.De ser así, ¿en esa forma lo tenías antes?

Como dice java.daba.doo puedes checar con un programa cliente de consultas desde la máquina en donde se encuentra el servidor de base de datos, si allí lanzas tu consulta sencilla y también está lenta se me ocurre que puede ser que

- El servidor en donde la migraste tenga menos memoria RAM o en disco
- En ese servidor exista más de una instancia de base de datos trabajando, consuma memoria y por lo tanto baja el rendimiento
- La estructura de tu base de datos no se migró correctamente, "volandose" algunos índices, pudieras comparar la estructura de tu base de datos recién montada contra una versión anterior para ver si ese es el problema.

Lo que menos pensaría que tiene el problema es la aplicación. porque antes funcionaba con buen desempeño, aunque no hay que descartar por completo revisar el código para optimizar consultas, aunque esta para mi sería la última opción a elegir.

GlassFish y Mysql

Muy Buenas Tardes.

Gracias por responder, Ok, olvide algunos detalles.

1. El servidor GlassFish y la base de datos se encuentra en el mismo servidor.
2. Utilizo una IP fija para conectarme desde afuera.
3. Las tablas las tengo optimizadas con sus indices.
4. Como hago las consultas? desde la aplicación armo una cadena para la consulta "SELECT CEDULA,PRIMERNBR FROM USUARIO WHERE ID = 'XX'" y esta cadena la envio atraves al modulo EJB que se encarga de hacer la consulta remotamente.
5. El modulo EJB lo invoco desde le contexto.

InitialContrext ctx = new InitialContext(propiedades)
en las propiedades especifico la ip y el puerto del servidor.

7. La aplicación en un desktop comun y corriente es el mismo que tenia cliente servidor. solo que la adecue para lo que se necesita.
8. antes de ejecutar la consulta tomo la conexion de un dataSource desde un JNDI, "jdbc/nombreBD" una vez ejecutada cierro la conexión a la base de datos.
9. Tengo solo una instancia en la base de datos.

Me falta aun seguir el consejo que me dan y hacer la prueba en el mismo servidor con la aplicación escritorio. ya me pongo en esa tarea y les estaré informando.

Saludos.

Jardo

Imagen de neko069

O_O

Podrías explicar más acerca de tu conexión a la base de datos??

9. Tengo solo una instancia en la base de datos.

Usas algún pool de conexiones? podrías postear el data source?

rendimiento en consultas

Revisa el servidor donde tienes montado el GlassFish y la b.d., monitorea el rendimiento de la memoria RAM y el cpu mientras se encuentre el server de aplicación levantado y estés lanzando tus consultas. Si tienes windows en tu server tan sólo tienes que entrar al administrador de tareas en la sección de rendimiento.

Si no tienes suficiente RAM y se satura cuando lanzas la consulta, entonces aumenta la memoria del server.

Otra cosa que estaba pensando es algo sencillo, estando fuera de tu red abre una ventana de intérprete de comandos haz un ping hacia tu server con ip fija, imaginemos que tu ip fija sea 192.168.1.201
entonces escribirías

ping 192.168.1.201

Si dentro del reporte que te presenta este comando ves algún retraso en el tiempo de respuesta o pérdida de paquetes, entonces el problema es de la red, un ejemplo de este reporte presentado que acabo de hacer en mi pc es el siguiente

ping

Haciendo ping a www-cctld.l.google.com [74.125.227.55] con 32 bytes de datos:
Respuesta desde 74.125.227.55: bytes=32 tiempo=431ms TTL=52
Respuesta desde 74.125.227.55: bytes=32 tiempo=287ms TTL=52
Respuesta desde 74.125.227.55: bytes=32 tiempo=280ms TTL=52
Respuesta desde 74.125.227.55: bytes=32 tiempo=328ms TTL=52

Estadísticas de ping para 74.125.227.55:
Paquetes: enviados = 4, recibidos = 4, perdidos = 0
(0% perdidos),
Tiempos aproximados de ida y vuelta en milisegundos:
Mínimo = 280ms, Máximo = 431ms, Media = 331ms

Imagen de Michel Zúñiga

Los dos son bien chingones

Los dos me gustan.. aunqe de eso no trate el tema, saludos!!!

Imagen de neko069

@Michel Zuñiga

Enriquecedor tu comentario, saludos.

Saludos

Si el comentario fue para mi, gracias y saludos de regreso, si no... pues también saludos cordiales.

GlassFish y Mysql

Buenos Dias.

Parte I.

Aqui les mando un ejemplo sencillo de como hago la conexión.a glassfish desde mi aplicacion desktop comun y corriente.

1. cargo un jndi.properties con la parametros al Contexto
2. Instancia la clases para conexión remota desde del EJB que se llama conexionGlassRemote
3. ejecuto la consulta con el método conexionGLASS.ejecutar que me retorna un vector(solo para probar)

public static void main(String[] args) {
try {
Properties props = new Properties();
//carga del archivo properties.
props.load(SwingEJB.class.getResourceAsStream("jndi.properties"));

InitialContext ctx = new InitialContext(props);
conexionGlassRemote conexionGLASS = (conexionGlassRemote) ctx.lookup("com.util.conexionGlassRemote");

Vector vecDepar = new Vector();
vecDepar.addAll(conexionGLASS.ejecutar("SELECT CEDULA,PRIMERNBR FROM usuario where cedula = '721542584'",2) );

for (int i = 0; i < vecDepar.size();i++){
System.out.println(vecDepar.get(i));
}

} catch (NamingException ex) {
Logger.getLogger(SwingEJB.class.getName()).log(Level.SEVERE, null, ex);
} catch (IOException ex) {
Logger.getLogger(SwingEJB.class.getName()).log(Level.SEVERE, null, ex);
}

Propiedades del jndi

Jndi.properties

# To change this template, choose Tools | Templates
# and open the template in the editor.
java.naming.factory.initial = com.sun.enterprise.naming.SerialInitContextFactory
java.naming.factory.url.pkgs = com.sun.enterprise.naming
java.naming.factory.state = com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl
#optional. Defaults to localhost. Only needed if web server is running
#ip del servidor glassfish.
org.omg.CORBA.ORBInitialHost = ipdelServidor
#optional. Defaults to 3700. Only needed if target orb port is not 3700.
org.omg.CORBA.ORBInitialPort = 3700

GlassFish y Mysql

Part II

Este es el codigo de mi modulo EJB que donde se implementa el acceso remoto, y que esta publicada
en el GlassFish de mi servidor.

1. En el metodo ejb cuenta con dos metodos el getConexionGlass que retorna la Conneccion tomada del datasource.
2. y el metodo ejecutar que ejecuta la consulta

@Stateless
public class conexionGlass implements conexionGlassLocal,conexionGlassRemote {

private int numRegistros = 0;
private Vector data1 = new Vector();

public String getMensajes(){
return "Si hizo la conexión ejb";
}

@Override
public Connection getConexionGlass() {
try {

InitialContext ic = new InitialContext();
DataSource ds = (DataSource) ic.lookup("jdbc/xxxyyy");

return ds.getConnection();

} catch (SQLException ex) {
Logger.getLogger(conexionGlass.class.getName()).log(Level.SEVERE, null, ex);
} catch (NamingException ex) {
Logger.getLogger(conexionGlass.class.getName()).log(Level.SEVERE, null, ex);
}
return null;
}

public Vector ejecutar (String Consulta, int tipo){

Vector vecDatos = new Vector();

try {

Connection C = getConexionGlass(); //aqui llamo mi conexion

Statement ins;
ins = C.createStatement();
ResultSet rs = ins.executeQuery(Consulta);

Vector d= new Vector();
String u= new String();

ResultSetMetaData rsmd = rs.getMetaData();

int min = 0;
while(rs.next())
{

//Hago la matriz*********************************************

d= crearFila(rs,rsmd);
//data1.add(min,crearFila(rs,rsmd));

for ( int i=0; i < 2; ++i)
u += d.get (i) + " ";
vecDatos.insertElementAt(u,min);
u="";

min++;
}
numRegistros = min;
ins.close();
C.close();
rs.close();
}

catch (SQLException E) {
System.out.println("Falla en Consulta " + E.getMessage());
System.out.println("SQLException: " + E.getMessage());
System.out.println("SQLState: " + E.getSQLState());
System.out.println("VendorError: " + E.getErrorCode());
}
return vecDatos;
}
}

GlassFish y Mysql

Ahí les muestro el código en la forma que lo hago, no se si si estoy haciendo lo correcto.

y disculpen que no sea constante en este espacio pero estos últimos días estoy un poco enredado en mi trabajo.

Gracias.