Buscar
Social
Ofertas laborales ES

Foro sobre Java SE > Web Services con JPA ,¿Cómo mejoro el rendimiento?

Hola Buenos Dias!!

Como primer punto quiero indicar que soy reciente usando JPA y pues hay varias cosas que talvez estoy haciendo de forma equivocada, pero es por ello que recurro a este foro espero me puedan ayudar.

Yo estoy realizando una aplicacion en java swing con la cual hago las consultas y modificacion de datos a la base por medio de web services, en ellos utilizo jpa. Bueno quisiera saber como puedo hacer que las respuestas a las consultas fuesen más rápidas. El punto .war de mi servicio web esta en un servidor que corre glassfish 4.0.

Cabe resaltar que utilizo una clase (web service) que tiene muchos metodos que utilizo en mi aplicacion, un metodo de consulta que suelo utilizar es como el que sigue:


@WebService(serviceName = "ServicioEmpresas")
public class ServicioEmpresas {

@WebMethod(operationName = "obtenerEmpresaCodigo")
public EmpresasHospital obtenerEmpresaCodigo(@WebParam(name = "codigo") String codigo) {
EntityManagerFactory emf = Persistence.createEntityManagerFactory("ProbandoWSPU");
EntityManager em = emf.createEntityManager();
Query q = em.createNamedQuery("EmpresasHospital.findByCodEmpresa").setParameter("codEmpresa", codigo);
EmpresasHospital empre;
try {
if (!q.getResultList().isEmpty()) {
empre = (EmpresasHospital) q.getSingleResult();
} else {
empre = null;
}
} catch (Exception e) {
empre = null;
System.out.println("Error en obtenerEmpresaCodigo: " + e);
}
em.close();
emf.close();
return empre;
}

}

Con eso pueden observar que cada vez que llamo a ese metodo se abre un entity manager factory y lo cierro al terminar. La idea está en que es muy lenta la devolución del resultado en mi aplicacion, y pues quisiera que me recomendaran cambios que deba hacer para que fuese mas rápido las consultas.

Agradezco de antemano los comentarios que puedan proporcionarme .

julio 18, 2015 | Unregistered CommenterAry

Hola, dices que creas una EntityManagerFactory cada vez que haces una consulta... has probado a no cerrar el entitymanagerfactory? Por lo general un EntityManagerFactory consume bastante recursos al iniciarse y se demora un poco, sobre todo si tienes muchos objetos mapeados. Por ello yo te recomendaria probar a no cerrar ese entitymanagerfactory y cndo llegue una nueva consulta en lugar de construir un entitymanagerfactory nuevo, usa el que ya tienes construido.

Otra opción seria usar jdbc sin JPA ni mas historias, al menos las conexiones no tardan tanto en crearse como un entitymanagerfactory...

Otra cosa, aunque uses swing, JPA, WWebservices,.... todo eso pertenece a JEE, si posteas en el otro subforo quiza te puedan dar mejores recomendaciones. Yo ejk aun estoy un poco verde en JEE.

Bueno suerte, y ya nos cuentas. Un saludo

julio 18, 2015 | Registered Commenterloderain

Tal como menciona @loderain crear el EntityManagerFactory es muy costoso. Intenta inyectando el EntityManager con la anotación


@PersistenceContext(unitName = "ProbandoWSPU")
private EntityManager entityManager;

El sistema te entregará un EntityManager listo para trabajar. Primero intenta eso y nos comentas.

julio 18, 2015 | Registered Commenterantoniovl

Agradezco enormemente sus comentarios: @loderain y @antoniovl

En un principio como dicen ustedes habia intentado declarar entity manager al inicio de la clase y no cerrarlo. Y tienen razon era más rápido, el problema radicaba en que cada vez que queria hacer un cambio al web service en el servidor de aplicaciones, no me dejaba hacerle un simple undeploy, deploy porque al parecer quedaba esa entity abierta (nunca cerraba), al colocar otra vez el web service me decia que ya estaba ahi así que tenia que reiniciar el servidor, cosa que no me conviene porque hay otras aplicaciones corriendo en él.

Perdon por postear este tema aca :S yo estoy más verde que un perico en Java

julio 20, 2015 | Unregistered CommenterAry

Tu servidor de aplicaciones corre en Windows?

julio 20, 2015 | Registered Commenterantoniovl

Hola!!! @antoniovl

El servidor corre sobre Linux, no recuerdo que distribución es, pero si estoy segura que es linux :)

julio 21, 2015 | Unregistered CommenterAry

Yo estoy usando JPA en una aplicación Swing. No sé decirte cuánto tarda en crearse un EntityManagerFactory, pero la instanciación de un EntityManager supone 3-4 segundos en dos equipos razonables (un Intel Core i5-460M con 4 GB y un AMD A-8 6800K con 8GB, sin mucha más actividad simultánea). Por tanto, evita a toda costa instanciar un EntityManager en cada petición.

No sé nada de Java EE, pero he leído que hay varios productos que permiten hacer redespliegues sin tirar abajo el servidor EE. Otra opción sería investigar cuál de las diferentes opciones para invocar un EntityManager en un entorno Java EE podría permitir el redespliegue sin tirar abajo el servidor.

julio 28, 2015 | Registered Commenterrickiees

Para no instanciar todas las veces esa clase usa el patrón singleton, sólo una instanciación la primera vez que su usa y listo.

http://codejavu.blogspot.com.es/2013/07/ejemplo-patron-singleton.html

julio 29, 2015 | Registered Commenterantuansoft

Muchas gracias @rickiees y @antuansoft por sus comentarios, intentare con el patron singleton a ver como funciona :) Hay les comento cualquier mejoría :D

agosto 3, 2015 | Unregistered CommenterAry

No sé si el patrón Singleton te va a funcionar con EntityManager. La razón es que EntityManager no es reentrante y, por tanto, no puedes asegurar que un mismo objeto sirva para dos hilo de ejecución distintos (algo bastante probable si se hacen dos peticiones muy seguidas a través del servidor web). Lo mismo sucede con una aplicación de escritorio que abra varios formularios a la vez que ataquen a la base de datos (mi caso, y lo que me ha dado muchos dolores de cabeza).

Tendrías que hacer un montón de métodos con synchronized, lo que a su vez te podría provocar bloqueos. O te organizas muy bien el código, o te puedes encontrar muchos problemas. Desde mi punto de vista, en una aplicación web es mejor usar varios EntityManager, dejando que sea JavaEE quien gestione la instanciación (o reutilización).

agosto 4, 2015 | Registered Commenterrickiees