Estoy usando Hibernate 4.1.6 y tengo problemas con la velocidad con la que se crea una lista. Estoy ejecutando la siguiente consulta.¿Por qué es lento Hibernate query.list()?
public void doQuery(final Baz baz){
final Query query = getSessionFactory().getCurrentSession().createQuery(
"select c.id, foo.someValue from Foo as foo "+
"join foo.a as a"+
"join foo.b as b "+
"join b.c as c "+
"where baz=:baz"
);
query.setParameter("baz", baz);
Long start=System.currentTimeMillis();
final List<Object[]> list = query.list();
Long end=System.currentTimeMillis();
System.out.println((end-start));
}
Configuré la depuración de hibernación para obtener la consulta real que se envía a la base de datos. Ejecuté esa consulta directamente en la base de datos y devolvió 23,000 filas en 0.015 ms. Entonces, supongo que la consulta no es el problema. El ejemplo anterior muestra que tarda ~ 32 segundos en crear esa lista. ¿Hay algo que se pueda hacer para acelerar eso?
Actualización: Intenté usar el método createSQLQuery() usando la consulta de depuración de hibernación y se ejecutó tan lento como el método createQuery().
Actualización: Intenté usar una sesión sin estado, pero se ejecutó con la misma lentitud.
Actualización: Me emite algunas estadísticas (el establecimiento del indicador hibernate.generate_statistics true) pero nada parece alarmante para mí:
Hibernate SessionFactory Statistics [
Number of connection requests[4]
Number of flushes done on the session (either by client code or by hibernate[3]
The number of completed transactions (failed and successful).[3]
The number of transactions completed without failure[3]
The number of sessions your code has opened.[4]
The number of sessions your code has closed.[3]
Total number of queries executed.[4]
Time of the slowest query executed.[28258]
the number of collections fetched from the DB.[6]
The number of collections loaded from the DB.[6]
The number of collections that were rebuilt[0]
The number of collections that were 'deleted' batch.[0]
The number of collections that were updated batch.[0]
The number of your objects deleted.[0]
The number of your objects fetched.[1]
The number of your objects actually loaded (fully populated).[204]
The number of your objects inserted.[1]
The number of your object updated.[0]
]
Hibernate SessionFactory Query Statistics [
total hits on cache by this query[0]
total misses on cache by this query[0]
total number of objects put into cache by this query execution[0]
Number of times this query has been invoked[1]
average time for invoking this query.[28258]
maximum time incurred by query execution[28258]
minimum time incurred by query execution[28258]
Number of rows returned over all invocations of this query[23303]
]
Actualización: Veo la misma lentitud cuando se hace un lado() desde un ScrollableResults desde una consulta nativa Tenga en cuenta que no estoy haciendo nada en el bucle.
ScrollableResults results = query.scroll();
Long start=System.currentTimeMillis();
while (results.next()) {
//do nothing
}
Long end=System.currentTimeMillis();
System.out.println((end-start));
podría ser un uncommited transacción que contiene las obras. –
Es posible que desee imprimir su sql de hibernación. Lo más probable es que tenga un problema de selección n + 1. –
Jordan, no sé de ninguna transacción que contenga esta consulta. John, imprimí el sql como se menciona arriba y la consulta está bien. – user973479