Mam witrynę o dużym natężeniu ruchu i używam hibernacji. Używam również ehcache do buforowania niektórych encji i zapytań, które są wymagane do generowania stron.Unikanie wielokrotnych repopulacji tego samego regionu pamięci podręcznej (z powodu współbieżności)
Problem polega na "równoległych chybionych pamięciach podręcznych", a długie wyjaśnienie polega na tym, że gdy aplikacja jest uruchamiana, a obszary pamięci podręcznej są zimne, każdy obszar pamięci podręcznej jest zapełniany wielokrotnie (zamiast tylko raz) przez różne wątki, ponieważ witryna jest używana trafiony przez wielu użytkowników w tym samym czasie. Ponadto, gdy jakiś region pamięci podręcznej unieważnia, jest on wielokrotnie zapełniany z tego samego powodu. Jak mogę tego uniknąć?
Udało mi się uzyskać convert 1 entity and 1 query cache to a BlockingCache, zapewniając własną implementację hibernate.cache.provider_class, ale semantyka BlockingCache nie działa. Nawet najgorsze czasami blokady Deadlocks Blocking (bloki) i aplikacja zawiesza się całkowicie. Zrzut wątku pokazuje, że przetwarzanie jest blokowane na muteksie BlockingCache podczas operacji pobierania.
Pytanie brzmi, czy Hibernate obsługuje ten rodzaj użytkowania?
A jeśli nie, jak rozwiązać ten problem przy produkcji?
Edit: The hibernate.cache.provider_class punkty do mojego niestandardowego dostawcy cache, która jest kopią pasta z SingletonEhCacheProvider i na końcu metody start() (po linii 136) zrobić:
Ehcache cache = manager.getEhcache("foo");
if (!(cache instanceof BlockingCache)) {
manager.replaceCacheWithDecoratedCache(cache, new BlockingCache(cache));
}
W ten sposób po inicjalizacji i zanim ktokolwiek dotknie pamięci podręcznej o nazwie "foo", ozdobię ją blokowaniem. "foo" to pamięć podręczna zapytań i "pasek" (ten sam kod, ale pominięty) to pamięć podręczna jednostek dla pojo.
Edytuj 2: "Wydaje się nie działać" oznacza, że początkowy problem nadal istnieje. Pamięć podręczna "foo" wciąż jest wielokrotnie ponownie zapełniana tymi samymi danymi ze względu na współbieżność. Potwierdzam to, podkreślając witrynę za pomocą JMeter z 10 wątkami. Oczekuję, że 9 wątków zablokuje się do pierwszego, który zażądał danych z "foo", aby zakończyć zadanie (wykonać zapytania, przechowywać dane w pamięci podręcznej), a następnie pobrać dane bezpośrednio z pamięci podręcznej.
Edycja 3: Innym wyjaśnieniem tego problemu może być postrzegane w https://forum.hibernate.org/viewtopic.php?f=1&t=964391&start=0 ale bez jednoznacznej odpowiedzi.
Interesującym rozwiązaniem, które może pomóc złagodzić ten problem, jest to, że teraz ehcache (od wersji 2.1) obsługuje strategię współbieżności pamięci podręcznej transakcji dla hibernacji: http://stackoverflow.com/questions/3472613/does-ehcache-2-1-support -transakcyjna-cache-współbieżność-strategia-w-hibernat/3474011 # 3474011 – cherouvim