2012-04-13 8 views
5

Mam następujące ustawienie:właściwości transakcja kwasu z Hibernate Search + Infinispan Dyrektorium

  • JPA (2.0) przez Hibernate (4,1)
  • Infinispan jako cache 2 poziomu (5,1)
  • Hibernate Search połączony do hibernacji (4,1)
  • Infinispan jako Directory Hibernate Search (Lucene)
  • Connected JDBC CacheStore dla Infinispan Informator
  • Baza danych PostgreSQL (9.1) do przechowywania zarówno encji, jak i katalogu Lucene.
  • Bitronix (2.1.2) jako Zarządcy Transakcji
  • nie używam Java EE, ale wiosna (3,1)

Infinispan jak Second Level Cache porządku, nie jest potrzebna i odzyskiwania można odczytać zmiany we własnej transakcji z powodu charakteru pamięci podręcznej.

Po godzinach odczytu kodów źródłowych, podczas aktualizacji jednostki, wyszukiwanie w trybie hibernacji nie aktualizuje Lucene Directory, ale na końcu transakcji (jeśli się zatwierdza), więc chciałem wyszukać tekst I ' ve właśnie zaktualizowany, w tej samej transakcji, nie byłbym w stanie?

Co więcej, wyszukiwanie w trybie hibernacji wykonuje aktualizacje do katalogu w innym wątku po zakończeniu transakcji. Więc jeśli jedna z aktualizacji katalogu się nie powiedzie, to Lucene będzie niespójna z moimi jednostkami? A jeśli coś się wydarzyło, zanim aktualizacje zostały wysłane do katalogu i konieczne było przywrócenie, czy te aktualizacje zostałyby utracone?

Zakładając pomyślne zakończenie tej "pierwszej" transakcji, aktualizacje zostały przesłane do katalogu Infinispan. Rozpoczęła się nowa transakcja. Przez kogo? Lucene ma opcje wysyłania aktualizacji za pomocą JMS. Powiedzmy, że opcja jest aktywowana, więc komunikat JMS inicjuje nową transakcję.

Infinispan zmodyfikuje swój katalog pamięci za pomocą otrzymanych aktualizacji, ale trwały magazyn CacheStore zostanie ponownie zaktualizowany po ukończeniu transakcji po zatwierdzeniu. Dlatego istnieje szansa, że ​​jeśli coś się stanie podczas aktualizacji cacheStore jdbc, nie będzie żadnych aktualizacji, ale katalog pamięci Infinispan będzie je stosować.

Moje pytanie brzmi, biorąc pod uwagę, że wszystkie moduły, z których korzystam, obsługują transakcje i że wspierają nawet dołączanie do transakcji globalnych (XA), czy istnieje sposób na osiągnięcie prawdziwej transakcji? Może po prostu tego nie widzę.

Odpowiedz

0

Pracuję nad bardzo podobną konfiguracją. W tych wersjach prawdziwa transakcyjność nie jest możliwa.Istnieje kilka powodów, z których niektóre zostały odnotowane:

  1. Hibernate Search robi aktualizacji indeksu w popełnić fazowe
  2. Hibernate Search procesów na wątków tła - nawet gdy „synchroniczny”
  3. Infinispan sklep cache aktualizacje są wykonywane w popełnić fazę

Tu faza transakcja ma znaczenie, ponieważ ewentualne wkłady do bazy danych muszą być wykonane w głównym korpusie o f transakcji i zobowiązane na końcu.

Moim rozwiązaniem było zignorowanie transakcji dla aktualizacji indeksu, nie było to konieczne w moim przypadku.