2012-01-24 11 views
6

Przechodziłem przez hibernację i sytuacje, kiedy używać Criteria vs HQL i rozumiem, że przy Hibernowaniu, za każdym razem, gdy przeszukujemy bazę danych przez Criteria lub HQL w obu przypadkach hibernacja otrzyma zestaw wyników i wprowadzi do pamięci, a następnie, gdy to nazwiemy zapytanie ponownie, dane będą pobierane z pamięci zamiast trafiania do tej bazy danych, czy moje zrozumienie jest poprawne?Czy zapytanie HQL zawsze trafia do bazy danych i uzyskuje wyniki?

Również, jak widać z komentarzy do pytania wspomnianego poniżej, zasugerowano, że Kryteria Hibernacji otrzymają dane z sesji, a HQL zawsze pójdzie i trafi w bazę danych, więc każda liczba wielu wywołań do kwerendy HQL pójdzie i trafi w bazę danych a jeśli tak, to wtedy HQL powoduje więcej problemów niż rozwiązywanie.

Prosimy o doradztwo w tej sprawie, ponieważ jestem trochę zmieszany z sytuacją.

Odniesienie do question

Odpowiedz

7

To zależy od tego, jakiego rodzaju zapytaniami robicie i informacji o ustawieniach pamięci podręcznej.

Hibernacja ma trzy rodzaje pamięci podręcznych: pamięć podręczną sesji, pamięć podręczną zapytań i pamięć podręczną drugiego poziomu. Pamięć podręczna sesji jest zawsze włączona, ale pozostałe dwie mogą być wyłączone.

Zwykle buforowanie nie jest powodem do faworyzowania API Criteria w stosunku do HQL i na odwrót. W większości są to po prostu różne interfejsy dla zasadniczo tej samej rzeczy.

Zobacz http://www.javalobby.org/java/forums/t48846.html i http://docs.jboss.org/hibernate/core/3.3/reference/en/html/performance.html

+1

AFAIK zapytania HQL użyje tylko cache zapytań i uzyskać wyniki tylko stamtąd, jeśli kwerenda i wszystkie parametry są takie same. – Thomas

+0

więc jeśli robię '" z "+ test.class.getName() + SORT_BY_ID ;, jak mogę zdecydować, czy uderza w pamięć lub bazę danych, jak również możemy zarządzać ustawieniami cache w hibernacji v3.2? – Rachel

+0

@Juha: więc teraz, kiedy mówisz, że sesja jest domyślnie zawsze włączona, HQL powinien uzyskać wynik z prawej sesji i nie trafiać ponownie w bazę danych, prawda? – Rachel

1

Zasadniczo jeśli generowanie zapytań jesteś prawdopodobnie będzie trafić do bazy danych, wyjątkiem jest, jeśli już w pamięci podręcznej kwerendy i parametry.

Kwerendy hibernacji (bez względu na to, czy używasz Kryteriów czy HQL) zwrócą tylko jednostki z pamięci podręcznej sesji (pamięć podręczna pierwszego poziomu), jeśli otrzymasz ją z @ID.

W celu buforowania zapytania można użyć następującej składni:

session.createQuery("from X as x").setCacheable(true); 

redagowany Komentarze:

Zapytanie nie jest taka sama jak dostać się z @Id. Aby dostać się do obiektu przez jego @Id byś napisać coś takiego:

Entity myEntity = sessionFactory.getCurrentSession().get(Entity.class, 1); 
+0

możesz podać przykład kwerend hibernacji, który pobiera go za pomocą '@ Id' – Rachel

+0

Coś takiego używa HQL do pobrania z kluczem podstawowym (@Id) session.createQuery (" from Entity e where e.id =? ") .setParameter (1, id) –

+0

To nie trafi w pamięć podręczną sesji. Tworzysz zapytanie, które ominie pamięć podręczną sesji i przejdzie od razu do bazy danych. Jeśli chcesz pobrać przez @Id użyj Load lub Get on the session. –

Powiązane problemy