Mamy aplikację, która używa pamięci podręcznej Hibernuj na drugim poziomie, aby uniknąć trafień bazy danych.Unieważnianie pamięci podręcznej drugiego poziomu Hibernacji, gdy inny proces modyfikuje bazę danych
Zastanawiam się, czy istnieje prosty sposób unieważnienia pamięci podręcznej Hibernuj 2nd poziomu aplikacji Java, gdy proces zewnętrzny, taki jak administrator MySQL, jest bezpośrednio podłączony do modyfikacji bazy danych (aktualizacja/wstawienie/usunięcie).
Używamy EHCache jako naszej implementacji pamięci podręcznej drugiego poziomu.
Używamy mieszankę @Cache (wykorzystanie = CacheConcurrencyStrategy.READ_WRITE) i @Cache (użytkowania = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE) i nie mamy optymistyczne kontroli współbieżności włączona za pomocą znaczników czasu na każdej jednostce.
SessionFactory zawiera metody zarządzania cache poziom 2: - Managing the Caches
sessionFactory.evict(Cat.class, catId); //evict a particular Cat
sessionFactory.evict(Cat.class); //evict all Cats
sessionFactory.evictCollection("Cat.kittens", catId); //evict a particular collection of kittens
sessionFactory.evictCollection("Cat.kittens"); //evict all kitten collections
Ale dlatego, że opisywanie poszczególnych klas encji z @Cache, nie ma centralne miejsce dla nas „wiarygodnie” (np brak instrukcji kroki) dodaj to do listy.
// Easy to forget to update this to properly evict the class
public static final Class[] cachedEntityClasses = {Cat.class, Dog.class, Monkey.class}
public void clear2ndLevelCache() {
SessionFactory sessionFactory = ... //Retrieve SessionFactory
for (Class entityClass : cachedEntityClasses) {
sessionFactory.evict(entityClass);
}
}
Nie ma prawdziwego sposób pamięci podręcznej poziomu 2 Hibernate wiedzieć, że jednostka zmieniła w DB, chyba że jednostka zapytań (czyli to, co cache chroni Cię przed). Może więc jako rozwiązanie możemy po prostu wywołać pewną metodę wymuszającą pamięć podręczną drugiego poziomu w celu eksmisji wszystkiego (ponownie z powodu braku kontroli blokowania i współbieżności ryzykujesz transakcje w trakcie "czytania" lub aktualizowania nieaktualnych danych).
Chcę wyczyścić dane pamięci podręcznej z pamięci podręcznej drugiego poziomu, wywołując poniższą metodę: - sessionFactory.getCache(). EvictEntityRegions(); Po prostu chcę wiedzieć, czy istnieje jakakolwiek szkoda w tym działaniu? Na przykład: - Co się stanie, jeśli spróbuję wyczyścić pamięć podręczną w trakcie transakcji? –