Bagian kode standar kami untuk menggunakan JDBC adalah ...
Connection conn = getConnection(...);
Statement stmt = conn.conn.createStatement (ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_READ_ONLY);
ResultSet rset = stmt.executeQuery (sqlQuery);
// do stuff with rset
rset.close(); stmt.close(); conn.close();
Pertanyaan 1: Saat menggunakan Connection Pool, haruskah seseorang menutup Connection di bagian akhir? Jika ya, bukankah tujuan pengumpulan hilang? Dan jika tidak, bagaimana DataSource mengetahui kapan instance tertentu dari Connection dibebaskan dan dapat digunakan kembali? Saya sedikit bingung tentang yang satu ini, ada petunjuk yang dihargai.
Pertanyaan 2: Apakah metode berikut mendekati standar? Sepertinya upaya untuk mendapatkan koneksi dari kumpulan, dan jika DataSource tidak dapat dibuat, gunakan DriverManager model lama. Kami bahkan tidak yakin bagian mana yang dieksekusi saat runtime. Mengulangi pertanyaan di atas, haruskah seseorang menutup Koneksi yang keluar dari metode seperti itu?
Terima kasih, - MS.
synchronized public Connection getConnection (boolean pooledConnection)
throws SQLException {
if (pooledConnection) {
if (ds == null) {
try {
Context envCtx = (Context)
new InitialContext().lookup("java:comp/env");
ds = (DataSource) envCtx.lookup("jdbc/NamedInTomcat");
return ds.getConnection();
} catch (NamingException e) {
e.printStackTrace();
}}
return (ds == null) ? getConnection (false) : ds.getConnection();
}
return DriverManager.getConnection(
"jdbc:mysql://"+ipaddy+":"+dbPort +"/" + dbName, uName, pWord);
}
Sunting: Saya pikir kita mendapatkan koneksi gabungan karena kita tidak melihat jejak tumpukan.
sumber
getConnection()
itu aneh. Lakukan saja di blok c'tor atau inisialisasi dari kelas yang sama, tanpa sinkronisasi / pemeriksaan nihil. Ini akan dipanggil sekali. Untuk lebih banyak petunjuk dan contoh awal, Anda mungkin menemukan artikel ini berguna.close()
mereka semua difinally
blok dari blok yang samatry
dengan tempat Anda memperoleh / membuatnya. Ini sepenuhnya terlepas dari apakah itu koneksi yang dikumpulkan atau tidak.Pool biasanya mengembalikan Anda objek Connection yang dibungkus, di mana metode close () diganti, biasanya mengembalikan Connection ke pool. Memanggil close () tidak masalah dan mungkin masih diperlukan.
Metode close () mungkin akan terlihat seperti ini:
Untuk pertanyaan kedua, Anda bisa menambahkan logger untuk menunjukkan apakah blok bawah pernah berjalan. Saya membayangkan meskipun Anda hanya ingin satu cara atau yang lain untuk konfigurasi koneksi database Anda. Kami hanya menggunakan kolam untuk akses database kami. Bagaimanapun juga, menutup koneksi akan sangat penting untuk mencegah kebocoran.
sumber
Calling close() is OK and probably still required.
, tidak memanggil tutup akan membocorkan sambungan, kecuali kumpulan menerapkan beberapa strategi pemulihanSebenarnya, pendekatan terbaik untuk manajemen koneksi adalah dengan tidak memasukkannya ke kode apa pun di mana pun.
Buat kelas SQLExecutor yang merupakan satu-satunya lokasi yang membuka dan menutup koneksi.
Seluruh aplikasi lainnya kemudian memompa pernyataan ke dalam pelaksana daripada mendapatkan koneksi dari kumpulan dan mengelola (atau salah mengaturnya) di semua tempat.
Anda dapat memiliki eksekutor sebanyak yang Anda inginkan, tetapi tidak seorang pun boleh menulis kode yang membuka dan menutup koneksi atas namanya sendiri.
Mudahnya, ini juga memungkinkan Anda mencatat semua SQL Anda dari satu set kode.
sumber