Podobne do tego questionPamięć podręczna zapytania w poszukiwaniu hibernacji - dla obiektów spoza pamięci podręcznej drugiego poziomu - ryzykowne? przydatny? zła praktyka?
Pomieszczenie:
To są moje założenia, w oparciu o moje doświadczenia, czytania i rozumienia, mogą być źle, jeśli są, proszę o komentarz i będę edytować pytanie .
- cache zapytań jest dobre w większości wraz z cache 2. poziom
- cache zapytań buforuje wyniki identyfikatory zapytań + parametrach
- cache zapytań jest ryzykowne, jeśli baza danych została zmieniona, i nie zostało odzwierciedlone do cache
Pytanie:
mam obiekt, który nie jest w pamięci podręcznej poziomu 2. Z powodu złego programowania lub innych ograniczeń, kod ładujący obiekt jest wywoływany kilka razy w tej samej sesji hibernacji. Odzyskiwanie wykorzystuje zapytanie HQL find np.
hibernateTemplate.find("from Foo f where f.bar > ?", bar);
Przed dodaniem cache zapytań, jeśli powyższy kod został nazwany N razy w tym samym hibernacji sesji było N trafia do bazy danych
Potem chciałem zobaczyć, co się stanie, jeśli dodam cache zapytań:
Query query = session.createQuery("from Foo f where f.bar > ?");
query.setCacheable(true);
query.setParameter(bar);
query.list();
Kiedy dodałem cache zapytań, zauważyłem, że podczas tej samej sesji, Hibernate nie trafić na bazie N razy więcej, tylko raz na sesję.
- Moje pierwsze założenie jest takie, że Hibernate najpierw wyszukuje w pamięci podręcznej sesji, a następnie w buforze drugiego poziomu. Czy to założenie jest poprawne?
- Zakładam również, że jeśli obiekt (
Foo
), który nie znajduje się w pamięci podręcznej drugiego poziomu, został zmieniony w bazie danych, a następnie bufor zapytań, z uwzględnieniem zakresu sesji, 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ń dla zapytań zawierających niezmienną informację nawet dla obiektów z pamięciami buforowymi innych niż 2L jest dobrą praktyką? (np. zapytanie, że 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 zmieniają się po utworzeniu)
Autor sposób, w pokrewnym question 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?
+1 za doskonale uformowane, sformatowane i zbadane pytanie. –