2012-02-13 13 views
5

I znaleziono wątku: How exactly JdbcTemplate with TransactionManager works together?Czy menedżer transakcji Spring wiąże połączenie z wątkiem?

pierwsze zdanie, że:

Tak dalece, jak rozumiane DataSourceTransactionManager wiąże połączenia JDBC z określonego źródła danych do bieżącego nici, co pozwala na jednej nitki związany Połączenie dla źródła danych. Jeśli jest to pula połączeń, zajmie jedno z dostępnych połączeń.

... jest dokładnie tym, co chcę wiedzieć.

Podczas korzystania z menedżera transakcji kończysz z każdym wątkiem mającym własne pojedyncze połączenie? Jak długo trwa to połączenie? Czy ten sam wątek używa tego samego połączenia podczas jednego żądania lub czy dzieje się coś innego? Próbuję tylko zrozumieć, co dokładnie Spring robi pod spodem, kiedy masz menedżera transakcji, a kiedy go nie masz (niezależnie od tego, czy faktycznie masz transakcję).

Odpowiedz

10

Podczas korzystania z menedżera transakcji kończysz z każdym wątkiem mającym własne pojedyncze połączenie? Jak długo trwa to połączenie?

Połączenie na ogół pochodzi z puli połączeń. Połączenie jest pożyczane od puli, gdy menedżer transakcji rozpoczyna transakcję, a następnie wraca do puli po zakończeniu transakcji. W tym czasie połączenie jest powiązane z wątkiem.

Czy tym samym wątku używać tego samego połączenia całej pojedynczego żądania

Korzysta z tego samego połączenia na czas trwania transakcji. Sam wniosek jest nieistotny.

niezależnie od tego, czy rzeczywiście mają transakcję

You zawsze mieć transakcję, czy robisz to w sposób wyraźny lub nie. Jeśli nie zostanie to jednoznacznie skonfigurowane, sterownik JDBC i baza danych będą uruchamiane i kończone tak długo, jak będzie to konieczne do wykonania pojedynczej operacji. Wiosenne zarządzanie transakcjami (lub dowolne inne zarządzanie transakcjami w ramach frameworka) pozwala wydłużyć czas trwania tej transakcji w wielu operacjach. Takie działanie wymaga wyłącznego korzystania z połączenia na czas trwania transakcji.

+0

Dziękuję za odpowiedź. Pomaga mi to zrozumieć nieco więcej z tego, co się dzieje. Rozumiem, w jaki sposób zarządzanie transakcjami pozwala na przedłużenie transakcji dla wielu operacji. Jednak w moim przypadku mam @Transactional (propagacja = Propagacja.SUPPORTS) na każdej z moich metod DAO, co oznacza, że ​​każde połączenie będzie używać własnej niezależnej transakcji. Gdy menedżer uzyskuje wstępne połączenie z puli, czy wiąże to połączenie z bieżącym wątkiem, a następnie pobiera go z niego do końca istnienia wątku, zamiast wracać do puli, aby uzyskać połączenie? – dnc253

+0

"każde połączenie będzie korzystać z własnej niezależnej transakcji" - nie jest to prawdą. Twoje DAO "odziedziczy" każdą istniejącą transakcję, która jest już związana z wątkiem. nie rozpocznie nowego, chyba że nikt już nie jest związany. – skaffman

+1

Myślę, że sposób, w jaki definiuję "transakcję" nie jest całkowicie poprawny.Sposób, w jaki zrozumiałem transakcję, ma miejsce, gdy masz jedną operację DB (która może mieć dowolną liczbę aktualizacji, wstawień itp.). Wszystko to dzieje się albo nic się nie dzieje. Sposób ustawiania DAO, każda metoda będzie działać na DB niezależnie od innych metod. Jeśli jedna metoda nie powiedzie się, nie wpłynie to na operacje wykonywane innymi metodami przed lub po nieudanym. Czym dokładnie jest "transakcja"? Myślałem, że każda metoda będzie tworzyć nową transakcję, ale tak nie jest? – dnc253

Powiązane problemy