Saya sedikit bingung, saya membaca di bawah ini dari 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();
}
Apakah Anda tidak perlu menutup koneksi conn? Apa yang sebenarnya terjadi jika conn.close () tidak muncul?
Saya memiliki aplikasi web pribadi yang saya pertahankan yang saat ini tidak menutup salah satu formulir, tetapi apakah yang penting benar-benar adalah pengelola, yang terhubung, atau keduanya?
Situs ini terus turun sesekali tetapi server terus mengatakan itu adalah masalah koneksi database, kecurigaan saya adalah itu tidak ditutup, tetapi saya tidak tahu mana yang harus ditutup.
java
database-connection
onaclov2000
sumber
sumber
Jawaban:
Ketika Anda selesai menggunakan milik Anda
Connection
, Anda perlu menutupnya secara eksplisit dengan memanggilclose()
metodenya untuk melepaskan sumber daya database lain (kursor, pegangan, dll) yang mungkin dipegang oleh koneksi.Sebenarnya, pola aman di Java adalah menutup Anda
ResultSet
,,Statement
danConnection
(dalam urutan itu) difinally
blok ketika Anda selesai dengannya, sesuatu seperti itu:The
finally
blok dapat sedikit meningkat menjadi (untuk menghindari cek null):Tapi, tetap saja, ini sangat bertele-tele sehingga Anda biasanya berakhir menggunakan kelas helper untuk menutup objek dalam metode helper yang aman-null dan
finally
bloknya menjadi seperti itu:Dan, sebenarnya, Apache Commons DbUtils memiliki
DbUtils
kelas yang melakukan itu sehingga tidak perlu menulis milik Anda sendiri.sumber
rs
,ps
,conn
mungkinnull
tergantung di mana istirahat kode. Itulah mengapa ini dikenal sebagai pola "aman".close
MetodeStatement
objek secara otomatis menutup yang terkaitResultSet
jika pernyataan tersebut memiliki set hasil terbuka. Demikian pula,close
metode dariConnection
kelas menutup semuaStatements
dariConnection
.Itu selalu lebih baik untuk menutup objek database / sumber daya setelah digunakan. Lebih baik menutup koneksi, resultet dan objek pernyataan di
finally
blok.Hingga Java7, semua sumber daya ini harus ditutup menggunakan
finally
blok. Jika Anda menggunakan Java 7, maka untuk menutup sumber daya Anda dapat melakukan hal berikut.Sekarang, objek con, stmt dan rs menjadi bagian dari blok percobaan dan java secara otomatis menutup sumber daya ini setelah digunakan.
Semoga saya bisa membantu.
sumber
ResultSet rs = conn.createStatement().executeQuery(sql);
di dalamtry
blok?Cukup menutup saja
Statement
danConnection
. Tidak perlu menutupResultSet
objek secara eksplisit .Dokumentasi Java mengatakan tentang
java.sql.ResultSet
:Terima kasih BalusC atas komentarnya: "Saya tidak akan mengandalkan itu. Beberapa driver JDBC gagal melakukannya."
sumber
Iya. Anda perlu menutup kumpulan hasil, pernyataan, dan koneksi. Jika koneksi datang dari sebuah pool, menutupnya sebenarnya akan mengirimnya kembali ke pool untuk digunakan kembali.
Anda biasanya harus melakukan ini dalam satu
finally{}
blok, sehingga jika ada pengecualian, Anda masih mendapat kesempatan untuk menutupnya.Banyak kerangka kerja yang akan menangani masalah alokasi / pelepasan alokasi sumber daya ini untuk Anda. misalnya JdbcTemplate Spring . Apache DbUtils memiliki metode untuk menjaga penutupan hasil / pernyataan / koneksi apakah null atau tidak (dan menangkap pengecualian saat menutup), yang juga dapat membantu.
sumber
Sebenarnya, yang terbaik adalah jika Anda menggunakan blok try-with-resources dan Java akan menutup semua koneksi untuk Anda saat Anda keluar dari blok try.
Anda harus melakukan ini dengan objek apa pun yang mengimplementasikan AutoClosable.
Panggilan ke getDatabaseConnection baru saja dibuat. Gantilah dengan panggilan yang memberi Anda koneksi SQL JDBC atau koneksi dari pool.
sumber
Ya, Anda harus menutup Koneksi. Jika tidak, klien database biasanya akan menjaga koneksi soket dan sumber daya lainnya tetap terbuka.
sumber