Sto utilizzando Hibernate EntityManager e sto vivendo un bizzarro rallentamento nelle mie query su Hibernate. Date un'occhiata a questo codice:Le query di ibernazione rallentano drasticamente dopo che un'entità viene caricata nella sessione
public void testQuerySpeed() {
for(int i = 0; i < 1000; i++) {
em.createNativeQuery("SELECT 1").getResultList();
}
}
Questo funziona in circa 750ms sulla mia macchina. Non incredibilmente veloce considerando che si tratta solo di selezionare un numero intero costante, ma accettabile. Il mio problema si pone nel momento in qualsiasi entità vengono caricati nella mia sessione EntityManager prima di lanciare la mia domanda:
public void testQuerySpeed() {
CommercialContact contact = em.find(CommercialContact.class, 1890871l);
for(int i = 0; i < 1000; i++) {
em.createNativeQuery("SELECT 1").getSingleResult();
}
}
L'em.find() è veloce, ma le query runtime 1000 è aumentato di oltre dieci volte, a circa 10 secondi. Se inserisco uno em.clear()
dopo lo em.find()
, il problema scompare nuovamente e il runtime torna a 750 ms.
Qui ho usato una query nativa, ma il problema esiste anche con le query HQL. Sembra che TUTTE le query richiedano almeno 70 ms ogni volta che un'entità si trova nella sessione EntityManager.
Questo calo delle prestazioni ci fa davvero male quando si generano elenchi in cui sono necessarie n + 1 query.
Ho testato l'ultima versione di Hibernate 3.5 beta e ho lo stesso identico problema. Qualcuno ha visto questo problema o qualche idea su come risolverlo?
Sto utilizzando PostgreSQL 8.3, utilizzando le transazioni locali delle risorse (in esecuzione in Tomcat). Utilizzando il pool di connessione integrato, ma l'utilizzo di C3P0 non ha fatto alcuna differenza.
hai il profilo it? Dove si trascorre la maggior parte del tempo? Avete definito metodi di ascolto/intercettazione/callback? – ChssPly76