2011-11-24 10 views
14

Zasadniczo mam (pomijając obsługę wyjątków, itp):Czy mogę zamknąć wyciągi transakcji przed zatwierdzeniem w Derby (JDBC)?

connection.setAutoCommit(false); 

Statement statement1 = connection.createStatement(); 
statement1.executeUpdate("..."); 
statement1.close(); 

Statement statement2 = connection.createStatement(); 
statement2.executeUpdate("..."); 
statement2.close(); 

connection.commit(); 

Jeśli dobrze rozumiem, to nie powinno mieć żadnego wpływu, ponieważ wszystko to naprawdę nie jest wolne środki na GC. Especially with Derby: Należy jawnie zamykać wyciągi, zestawy wyników i połączenia, gdy już ich nie potrzebujesz. Połączenia z Derby są zasobami zewnętrznymi względem aplikacji, a moduł czyszczenia pamięci nie zamyka ich automatycznie.

Czy jednak spowoduje to problemy z transakcją? Nie wierzę, że transakcja opiera się na oświadczeniu. Czy ktoś może to potwierdzić?

+0

Wygląda na to, że po zamknięciu instrukcji, _transaction_ jest nadal otwarte po stronie DB (oczekiwanie na zatwierdzenie lub wycofanie). Jest on kończony/zamykany po wydaniu komendy commit lub rollback dla połączenia. Czy mam rację? – ADTC

Odpowiedz

15

Absolutnie możesz je zamknąć, a powinieneś.

+2

+1 za "powinien" –

+0

Zgadzam się. Ale czy może to być ZANIM transakcja została zakończona, czy musi to być po zakończeniu transakcji? –

6

Ogólnie rzecz biorąc, po wykonaniu Statement, bazowe źródło danych/baza danych jest odpowiedzialne za zapewnienie pomyślnego wykonania. Oczekuje się, że każda awaria spowoduje zgłoszenie SQLException w wywołaniach Statement.executeXXX. Każde pomyślne wykonanie spowoduje, że baza danych będzie śledzić te aktualizacje w tymczasowym obszarze roboczym. Zatwierdzenie transakcji zapewnia jedynie, że aktualizacje spowodowane przez wyciągi są zapisywane w trwałym magazynie z tymczasowego obszaru roboczego. Jest tak często w większości/wszystkich bazach danych.

Dlatego bezpieczne jest zamknięcie obiektu Statement, gdy już go nie potrzebujesz, bez napotkania jakichkolwiek skutków ubocznych w transakcji.

0

Oczywiście zamknięcie wyciągów przed dokonaniem transakcji jest oczywiście bezpieczne. Powinieneś przeczytać - Closing Statement object prior to committing z coderanch i JDBC Transactions tutorial.

+2

Zrobiłem, obaj w rzeczywistości. Komentarze na temat Java Ranch zaczynają się od "Wierzę", co nie jest potwierdzeniem, a nikt go nie poparł, dyskusja toczyła się o krok. Samouczek JDBC zamyka instrukcje w bloku finally, po zatwierdzeniu. I nie ma żadnej wzmianki o tym, co się stanie, jeśli zamkniesz Deklarację wcześniej. Proszę więc zachować ostrożność w swoich komentarzach, nie jest to oczywiste, ani nie jest podane w żadnym z tych odniesień ... –

1

Yup. Jest to dobra praktyka i podejście do zamknięcia sprawozdania przed dokonaniem transakcji.

Powiązane problemy