Używam kwerend HQL w Hibernate i zastanawiałem się, czy mogę zwiększyć wydajność ponownych zapytań w aplikacji.Ponowne wykorzystanie zapytań w Hibernate
Zazwyczaj trzeba utworzyć nowy obiekt Query dla każdej sesji:
Session session;
Query q1 = session.createQuery("select a from Article a where id=:id");
q1.setInteger("id",123);
List result = q1.list();
Teraz mam stosunkowo złożonych zapytań w HQL, które nie chcą mieć analizowany w kółko. Czy istnieje sposób na utworzenie zapytania i ponowne użycie go w innej sesji? Tak:
Session session;
Query q2 = q1.reattach();
q2.setInteger("id",123);
List result = q2.list();
Jeśli Hibernate wykorzystuje sprawozdania przygotowanego tak, to powinno być godne przyrost wydajności, zwłaszcza w połączeniu z pula połączeń, które buforuje przygotowanych sprawozdań.
EDIT: Ponowne użycie zapytań w hibernacji zwykle nie jest potrzebne, ponieważ plan kwerend jest już buforowany w klasie mimo to QueryPlanCache. Kwerendy nazwane również nie zapewniają żadnej poprawy, ponieważ są używane tylko do wyszukiwania ciągu zapytania i żaden plan nie jest z nimi powiązany.
Podsumowując: Nie ma sensu ponownie wykorzystywać zapytania w hibernacji. Tylko pamiętaj, aby używać zapytań sparametryzowanych ZAWSZE, więc pamiętaj, aby buforowanie planu było małe.
@allingeek: Na czym dokładnie? Po prostu otwórz QueryPlanCache ze źródła Hibernate. Albo co miałeś na myśli? – Daniel
To, czego naprawdę szukałem, to ponowne użycie PreparedStatement. Przepuściłem konfigurację pamięci podręcznej instrukcji w c3p0 na podstawie twojego pytania i zapisałem dzień. Dzięki. – allingeek