2009-08-25 22 views
13

Mam obiekt domeny Hibernuj, który jest ładowany przez różne części aplikacji. Czasami jest to korzystne, aby leniwy załadować każde skojarzenie i inne, lepiej jest załadować całą rzecz w jednym sprzężeniu. Jako miejmy nadzieję szczęśliwy kompromis, znalazłem:Hibernate: batch_size? Pamięć podręczna drugiego poziomu?

Podczas pobierania wsadowego, Hibernate może załadować kilka niezainicjowanych serwerów proxy, jeśli dostęp do jednego proxy jest możliwy. Batch fetching to optymalizacja strategii leniwego wyboru pobierania.

hibernate.default_batch_fetch_size:

Korzystanie wsadowy sprowadzanie, Hibernate można załadować kilka niezainicjowane proxy jeśli proxy dostępu. Pobieranie wsadowe to optymalizacja strategii lazy select fetching.

również patrz

hibernate.jdbc.fetch_size:

Wartość niezerowe określa JDBC pobierania wielkości (połączenia Statement.setFetchSize()).

Cóż jest na tyle inteligentny, aby wyglądać w pamięci podręcznej drugiego poziomu podczas pobierania partii? np. czy jedno pobranie dla pierwszego połączenia do asocjacji, a następnie kolejne wywołania X trafiają w pamięć podręczną? W ten sposób mogę mieć leniwy ładunek, którego pragnę, ale także często trafiać do pamięci podręcznej, aby uzyskać bardziej masowe transakcje.

Jeśli cała zawartość kolekcji jest już zawarta w pamięci podręcznej, czy nadal będzie wykonywać kwerendy pobierania dotyczące dostępu do kolekcji?

Dzięki.

+0

Jest to również coś, co chciałbym znać również i na tę odpowiedź. – Zoidberg

+1

Oznacz moje pytanie :-) – davidemm

Odpowiedz

6

Zrobiłem wiele badań dzisiaj i byłem w stanie wykopać odpowiedź na moje własne pytanie. Przeglądałem kod hibernacji, a przepływ wygląda następująco:

Czy kolekcja została zainicjowana?

  • Nie? Wykonaj pobieranie wsadowe (elementy pobrane przez wsadowe są umieszczane w pamięci podręcznej)
  • Tak? Zajrzyj do pamięci podręcznej dla danego przedmiotu, jeśli go nie ma, wykonaj pobieranie wsadowe.

Jeśli element w kolekcji, której szukasz, znajduje się w pamięci podręcznej, pobieranie wsadowe się nie dzieje. Jeśli element NIE ZOSTANIE znaleziony w pamięci podręcznej drugiego poziomu, nastąpi pobieranie wsadowe, ALE wykona pobieranie partii danych, NIEZALEŻNIE od tego, czy partie w pakiecie znajdują się w pamięci podręcznej.


----- Przykład 1 -----

dobre: ​​

(trzy elementy w kolekcji - Wielkość partii: 3) Pierwszy GO:

  • collection.getItem (0) - Brak pamięci podręcznej | batch-fetch 3 elementy kolekcja
  • .GetItem (1) - załadowany przez partię-fetch
  • collection.getItem (2) - załadowany przez partię-fetch

Teraz, gdzieś indziej, w późniejszym czasie:

  • kolekcję. GetItem (0) - bufor istnieje
  • collection.getItem (1) - bufor istnieje
  • collection.getItem (2) - bufor istnieje

----- Przykład 2 -----

Zła:

(trzy elementy zbiór - wielkość partii 3)

W tym przypadku, element o indeksie 0 ° C usunięto z pamięci podręcznej, ponieważ być może pamięć podręczna była pełna i element został upuszczony, lub element stał się nieaktualny lub bezczynny.

  • collection.getItem (0) - Not In Cache tak samo serii 3 (select * gdzie id w (,,)??)
  • collection.getItem (1) - w pamięci podręcznej Już (zastąpiony W każdym razie przez partię-fetch)
  • collection.getItem (2) - W Cache już (zastąpiony przez anyway partii-fetch)

więc kompromis jest to, że będziesz miał mniej połączeń SQL z powodu grupowania, ale będziesz częściej pomijać pamięć podręczną. Dostępny jest bilet umożliwiający sprawdzenie wsadowe w pamięci podręcznej drugiego poziomu, zanim przejdzie do bazy danych.

http://opensource.atlassian.com/projects/hibernate/browse/HHH-1775

Zagłosuj it up!

Powiązane problemy