Jestem trochę zdezorientowany, czytałem poniżej z http://en.wikipedia.org/wiki/Java_Database_Connectivity
Connection conn = DriverManager.getConnection(
"jdbc:somejdbcvendor:other data needed by some jdbc vendor",
"myLogin",
"myPassword" );
Statement stmt = conn.createStatement();
try {
stmt.executeUpdate( "INSERT INTO MyTable( name ) VALUES ( 'my name' ) " );
} finally {
//It's important to close the statement when you are done with it
stmt.close();
}
Nie musisz zamykać połączenia Connected? Co tak naprawdę się dzieje, jeśli conn.close () nie występuje?
Mam prywatną aplikację internetową, którą utrzymuję, która obecnie nie zamyka żadnego z formularzy, ale czy naprawdę ważna jest ta stmt, połączona, czy obie?
Witryna sporadycznie wyłącza się, ale serwer wciąż mówi, że jest to problem z połączeniem z bazą danych. Podejrzewam, że nie jest zamykana, ale nie wiem, który z nich zamknąć.
java
database-connection
onaclov2000
źródło
źródło
Odpowiedzi:
Kiedy skończysz używać swojego
Connection
, musisz jawnie zamknąć go, wywołując jegoclose()
metodę, aby zwolnić inne zasoby bazy danych (kursory, uchwyty itp.), Które może utrzymywać połączenie.Faktycznie, bezpieczne deseń w Javie jest zamknąć
ResultSet
,Statement
iConnection
(w tej kolejności) wfinally
bloku, kiedy jesteś z nimi zrobić, coś takiego:finally
Blok może być nieznacznie poprawiła się (w celu uniknięcia sprawdzanie null):Ale nadal jest to bardzo rozwlekłe, więc generalnie kończysz używając klasy pomocniczej do zamykania obiektów w metodach pomocniczych o wartości null-safe, a
finally
blok staje się mniej więcej taki:W rzeczywistości Apache Commons DbUtils ma
DbUtils
klasę, która dokładnie to robi, więc nie ma potrzeby pisania własnej.źródło
rs
,ps
,conn
może byćnull
w zależności od miejsca złamania kodu. Dlatego jest to znane jako „bezpieczny” wzorzec.close
MetodaStatement
obiektu automatycznie zamyka skojarzony,ResultSet
jeśli instrukcja ma otwarty zestaw wyników. Podobnie,close
sposób zConnection
klasy zamyka wszystkieStatements
zConnection
.Zawsze lepiej jest zamknąć bazę danych / obiekty zasobów po użyciu. Lepiej zamknąć obiekty połączenia, zestawu wyników i instrukcji w
finally
bloku.Aż do Java7 wszystkie te zasoby muszą być zamknięte za pomocą
finally
bloku. Jeśli używasz języka Java 7, to w celu zamknięcia zasobów możesz wykonać następujące czynności.Teraz obiekty con, stmt i rs stają się częścią bloku try, a java automatycznie zamyka te zasoby po użyciu.
Mam nadzieję, że byłem pomocny.
źródło
ResultSet rs = conn.createStatement().executeQuery(sql);
Wewnątrztry
bloku?Wystarczy zamknąć tylko
Statement
iConnection
. Nie ma potrzeby jawnego zamykaniaResultSet
obiektu.Dokumentacja Java mówi o
java.sql.ResultSet
:Dzięki BalusC za komentarze: „Nie polegałbym na tym. Niektóre sterowniki JDBC na tym zawodzą”.
źródło
Tak. Musisz zamknąć zestaw wyników, instrukcję i połączenie. Jeśli połączenie pochodzi z puli, zamknięcie go w rzeczywistości odsyła z powrotem do puli w celu ponownego wykorzystania.
Zwykle musisz to zrobić w
finally{}
bloku, tak że jeśli zostanie zgłoszony wyjątek, nadal masz szansę to zamknąć.Wiele frameworków zajmie się tym problemem alokacji / zwalniania zasobów. np. Spring's JdbcTemplate . Apache DbUtils ma metody, które dbają o zamknięcie zestawu wyników / instrukcji / połączenia, niezależnie od tego, czy mają wartość null, czy nie (i przechwytywanie wyjątków po zamknięciu), co również może pomóc.
źródło
Właściwie najlepiej jest użyć bloku try-with-resources, a Java zamknie wszystkie połączenia po wyjściu z bloku try.
Powinieneś to zrobić z każdym obiektem, który implementuje AutoClosable.
Wywołanie getDatabaseConnection zostało właśnie utworzone. Zastąp go wywołaniem, które zapewnia połączenie JDBC SQL lub połączenie z puli.
źródło
Tak, musisz zamknąć połączenie. W przeciwnym razie klient bazy danych będzie zazwyczaj utrzymywał otwarte połączenie z gniazdem i inne zasoby.
źródło