Pengecualian menunjukkan kasus khas kode aplikasi yang membocorkan koneksi database. Anda perlu memastikan bahwa Anda memperoleh dan tutup semuanya (Connection
, Statement
dan ResultSet
) dalam try-with-resources
blok di blok metode yang sama sesuai dengan idiom JDBC normal.
public void create(Entity entity) throws SQLException {
try (
Connection connection = dataSource.getConnection();
PreparedStatement statement = connection.prepareStatement(SQL_CREATE);
) {
statement.setSomeObject(1, entity.getSomeProperty());
// ...
statement.executeUpdate();
}
}
Atau saat Anda tidak menggunakan Java 7, dalam try-finally
memblokir. Menutupnya di finally
akan menjamin bahwa mereka juga ditutup jika ada pengecualian.
public void create(Entity entity) throws SQLException {
Connection connection = null;
PreparedStatement statement = null;
try {
connection = dataSource.getConnection();
statement = connection.prepareStatement(SQL_CREATE);
statement.setSomeObject(1, entity.getSomeProperty());
// ...
statement.executeUpdate();
} finally {
if (statement != null) try { statement.close(); } catch (SQLException logOrIgnore) {}
if (connection != null) try { connection.close(); } catch (SQLException logOrIgnore) {}
}
}
Ya, Anda tetap harus menutup koneksi sendiri, bahkan saat menggunakan connection pooling. Ini adalah kesalahan umum di antara para pemula bahwa mereka berpikir bahwa itu akan secara otomatis menangani penutupan. Ini tidak benar . Kumpulan koneksi yaitu mengembalikan koneksi yang dibungkus yang melakukan sesuatu seperti berikut di close():
public void close() throws SQLException {
if (this.connection is still eligible for reuse) {
do not close this.connection, but just return it to pool for reuse;
} else {
actually invoke this.connection.close();
}
}
Tidak menutupnya akan menyebabkan koneksi tidak dilepaskan kembali ke kumpulan untuk digunakan kembali dan dengan demikian akan memperoleh yang baru lagi dan lagi sampai DB kehabisan koneksi yang akan menyebabkan aplikasi Anda mogok.
Lihat juga:
- Seberapa sering Connection, Statement, dan ResultSet harus ditutup di JDBC?
- Apakah aman menggunakan instance java.sql.Connection statis dalam sistem multithreaded?
- Menutup Koneksi JDBC di Pool