Uso le query HQL in Hibernate, e mi sono semplicemente chiesto se potevo aumentare le prestazioni della mia app riutilizzando le query.Riutilizzo di query in Hibernate
Di solito è necessario creare un nuovo oggetto di query per ogni sessione:
Session session;
Query q1 = session.createQuery("select a from Article a where id=:id");
q1.setInteger("id",123);
List result = q1.list();
ora ho query relativamente complesse in HQL, che io non voglio avere analizzato più e più volte. C'è un modo per creare una query e riutilizzarla in un'altra sessione? Come questo:
Session session;
Query q2 = q1.reattach();
q2.setInteger("id",123);
List result = q2.list();
Se Hibernate usa istruzioni preparate in ogni caso, questo dovrebbe essere un guadagno di prestazioni notevoli, soprattutto in combinazione con un ConnectionPool che memorizza nella cache istruzioni preparate.
EDIT: il riutilizzo di query in modalità di sospensione non è in genere necessario, poiché il piano di query è già memorizzato nella classe QueryPlanCache. Anche le Query nominate non forniscono alcun miglioramento, perché sono usate solo per cercare la stringa di query e nessun piano è associato a loro.
Per concludere: non è utile riutilizzare le query in sospensione. Assicurati solo di utilizzare le query parametrizzate SEMPRE, quindi mantieni le cache del piano piccole.
@allingeek: su cosa esattamente? Basta aprire QueryPlanCache dalla sorgente di Hibernate. O cosa intendevi? – Daniel
Quello che stavo veramente cercando era il riutilizzo di PreparedStatement. Inseguito la configurazione della cache dell'istruzione in c3p0 in base alla tua domanda e salvato il giorno. Grazie. – allingeek