5

Zgodnie z Hibernate docs, w środowisku JTA domyślnym trybem zwolnienia połączenia jest after_statement, co oznacza, że ​​po każdym poleceniu zostanie zwolnione połączenie logiczne hibernacji.Czy bezpieczne jest ustawienie opcji Hibernate after_transaction jako trybu zwalniania połączenia JTA podczas korzystania z Bitronix Transcation Manager?

Po zwolnieniu połączenia logicznego wywoływana jest metoda Connection close(), a bieżący zasób jest usuwany z listy w menedżerze transakcji.

Według RedHat'a transaction developer guide:

„Metoda delistResource wykorzystuje się do dysocjacji określonego zasobu od kontekstu transakcyjnego na obiekcie docelowym serwer aplikacji wywołuje metodę z dwoma parametrami.

An XAResources object, which represents the resource. 
A flag to indicate whether the operation is due to the transaction being suspended (TMSUSPEND), a portion of the work has failed (TMFAIL), or a normal resource release by the application (TMSUCCESS)." 

Ponieważ Bitronix używa TMSUCCESS:

currentTransaction.delistResource(xaResourceHolderState.getXAResource(), XAResource.TMSUCCESS); 

Oznacza to, że połączenie jest odłączone od bieżącego gałąź transakcji i czasami może się skończyć enlisting 2 different connections for the same Resource Adapter.

Uważam, że utrzymywanie połączenia na tyle, na ile trwa Transakcja, jest lepszym wyborem, ponieważ zwykle wykonujemy więcej niż jedno oświadczenie na transakcję. Tak więc tryb wydania after_transaction brzmi bardziej zachęcająco.

Czy tryb zwolnienia after_transaction jest bardziej odpowiedni dla Bitronix? Czy ktoś go doświadczył w środowisku produkcyjnym?

Odpowiedz

6

Nie powinieneś widzieć żadnej różnicy między after_statement i after_transaction, przynajmniej z BTM. Teoretycznie, after_statement jest "bardziej poprawne", ponieważ połączenie i transakcja mają być całkowicie niezależne w kontekście XA, a połączenie powinno obsługiwać wiele transakcji jednocześnie. W praktyce połączenia i transakcje prawie nigdy nie są niezależne, ponieważ prawie żaden zasób tego nie obsługuje.

Pula połączeń BTM implementuje relatywnie złożony moduł FSM, który pozwala mu utrzymywać transakcje izolowane na ich połączeniach, a jednocześnie w miarę możliwości ponownie używać połączenia.

W kontekście pojedynczej transakcji, wielokrotnego uzyskiwania połączenia z puli, zamknięcie go powinno zużywać tylko jedno połączenie z puli: to samo powinno być zawsze odkładane na bok przez pulę i ponownie używane. Jedynym powodem, dla którego mogę o tym pomyśleć, byłoby pobranie dwóch połączeń z puli, jeśli ponownie uzyskasz połączenie, podczas gdy pierwsza nie została jeszcze zamknięta. Każdy inny powód może być prawdopodobnie uznany za błąd w puli połączeń BTM.

+1

Dzięki za odpowiedź Ludovic. Chodzi o to, że zamierzamy wypuścić nasz system do produkcji i nie mieliśmy czasu na przetestowanie go za pomocą zestawu flag "after_transaction". Ze względu na złożoność Spring TM, opakowanie transakcyjne Hibernate Transaction Logic i wewnętrzne operacje Bitronix, bardzo trudno jest wskazać sprawcę. Chociaż widziałem, że 2 połączenie zostało zarejestrowane, to 2PC po prostu potraktuje je jako tylko 2 pojedyncze źródła XAR, więc atomowość TX jest gwarantowana. Może po premierze produkcji będę miał więcej czasu, żeby się w to zagłębić. –

+0

Kiedy ścigam ten rodzaj problemu, dzienniki debugowania BTM są nieocenione. Włącz je i upewnij się, że skonfigurowano Zmapowany kontekst diagnostyczny, aby wyświetlić identyfikator GTRID (patrz http://docs.codehaus.org/display/BTM/DebugLogging2x). W ten sposób można łatwo oddzielić pracę wykonywaną w imieniu każdej transakcji (np. Dzieląc dzienniki na transakcję prostym grepem) i dość łatwo śledzić przepływ logiczny puli połączeń. –

+1

Dzięki, na pewno spróbuję.To dość frustrujące, że nie mogliśmy nigdy wyizolować problemu w jednostce lub teście integracji. Mam test integracji systemu, działający na rzeczywistym serwerze podobnym do produkcji, gdzie mogłem zobaczyć tę anomalię zgłoszoną w dziennikach. Kiedy zbieram informacje, zaciemnię niektóre nazwy klas i opublikuję je w poście o problemach z BTM, może zauważysz anomalię przepływu. –

Powiązane problemy