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?
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ć. –
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ń. –
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. –