estoy usando Hibernate EntityManager, y estoy experimentando una desaceleración raro en mis consultas Hibernate. Eche un vistazo a este código:consultas Hibernate ralentizar drásticamente después de una entidad se carga en la sesión
public void testQuerySpeed() {
for(int i = 0; i < 1000; i++) {
em.createNativeQuery("SELECT 1").getResultList();
}
}
Esto se ejecuta en aproximadamente 750ms en mi máquina. No es increíblemente rápido teniendo en cuenta que solo selecciona un entero constante, pero aceptable. Mi problema surge el momento ninguna entidad se cargan en mi sesión de EntityManager antes de lanzar mi consulta:
public void testQuerySpeed() {
CommercialContact contact = em.find(CommercialContact.class, 1890871l);
for(int i = 0; i < 1000; i++) {
em.createNativeQuery("SELECT 1").getSingleResult();
}
}
El em.find() es rápido, pero el tiempo de ejecución 1000 consultas aumentó más de diez veces, hasta aproximadamente 10 segundos. Si pongo un em.clear()
después del em.find()
, el problema desaparece nuevamente y el tiempo de ejecución vuelve a 750ms.
he utilizado una consulta nativa aquí, pero existe el problema con HQL consulta también. Parece que TODAS las consultas toman al menos 70 ms cada vez que una entidad se encuentra en la sesión de EntityManager.
Esta caída de rendimiento realmente nos está haciendo daño al generar listas en las que se necesitan n + 1 consultas.
He probado la última Hibernate 3.5 beta, y tienen exactamente el mismo problema. ¿Alguien ha visto este problema o alguna idea sobre cómo solucionarlo?
estoy usando PostgreSQL 8.3, utilizando las transacciones locales de recursos (que se ejecuta en Tomcat). Usar el grupo de conexiones integrado, pero usar C3P0 no hizo diferencia.
¿Se perfila? ¿Dónde se gasta la mayor parte del tiempo? ¿Tiene algún oyente/interceptores/métodos de devolución de llamada definidos? – ChssPly76