Hibernacja pamięci podręcznej zapytań - dla obiektów nie znajdujących się w pamięci podręcznej drugiego poziomu - ryzykowne? przydatny? zła praktyka?

Związany z tympytanie

Przesłanka:

To są moje przypuszczenia, oparte na moim czytaniu, doświadczeniu i zrozumieniu, mogą się mylić, jeśli są, skomentuj, a ja zredaguję pytanie.

Pamięć podręczna zapytań jest dobra, głównie z pamięcią podręczną drugiego poziomuPamięć podręczna zapytań buforuje wyniki identyfikatorów zapytań + parametrówPamięć podręczna zapytań jest ryzykowna, jeśli baza danych została zmieniona i nie została odzwierciedlona w pamięci podręcznej

Pytanie:

Mam obiekt, który nie znajduje się w pamięci podręcznej drugiego poziomu. Z powodu złego programowania lub innych ograniczeń kod ładujący obiekt jest wywoływany kilka razy w tej samej sesji hibernacji. Retrival korzysta z zapytania wyszukiwania HQL, np.

 hibernateTemplate.find("from Foo f where f.bar > ?", bar);

Przed dodaniem pamięci podręcznej zapytań, jeśli powyższy kod został nazwany N razy w ramach tej samej sesji Hibernate, do bazy danych trafiło N trafień

Potem chciałem zobaczyć, co się stanie, jeśli dodam pamięć podręczną zapytań:

 Query query = session.createQuery("from Foo f where f.bar > ?");
 query.setCacheable(true);
 query.setParameter(bar);
 query.list();

Kiedy dodałem pamięć podręczną zapytań, zauważyłem, że podczas tej samej sesji hibernacja nie trafia już do bazy danych N razy, tylko raz na sesję.

Tak więc moim pierwszym założeniem jest to, że Hibernate najpierw wyszukuje w pamięci podręcznej sesji, a następnie w pamięci podręcznej drugiego poziomu. Czy to założenie jest poprawne?Zakładam również, że jeśli obiekt (Foo), która nie znajduje się w pamięci podręcznej drugiego poziomu, została zmieniona w bazie danych, a następnie pamięć podręczna kwerendy, będąca zakresem sesji krzyżowej, zwróci nieprawidłowe identyfikatory, a tym samym nieprawidłowe obiekty. Czy to jest poprawne?Czy można bezpiecznie powiedzieć, że używanie pamięci podręcznej zapytań do zapytań, które zawierają niezmienne informacje, nawet w przypadku obiektów przechowywanych w pamięci podręcznej innych niż 2L, jest dobrą praktyką? (np. zapytanie, którego klauzula where zawiera warunek, który zawsze zwróci te same wyniki, np. „wybierz p.ser_num gdzie p.id =?”, gdy pary ser_num i id nie zmienią się po utworzeniu)

Przy okazji, w pokrewnychpytanie twierdzi się, że pamięć podręczna zapytań nie działa w zakresie pamięci podręcznej sesji. Czy nie rozumiem tego twierdzenia, czy cokolwiek innego?

questionAnswers(3)

yourAnswerToTheQuestion