Ngoại lệ chỉ ra một trường hợp điển hình của mã ứng dụng làm rò rỉ các kết nối cơ sở dữ liệu. Bạn cần đảm bảo rằng bạn có được và đóng tất cả chúng (Connection
, Statement
và ResultSet
) trong try-with-resources
trong cùng một khối phương thức theo thành ngữ JDBC thông thường.
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();
}
}
Hoặc khi bạn không sử dụng Java 7, trong try-finally
khối. Đóng chúng trong finally
sẽ đảm bảo rằng chúng cũng được đóng trong trường hợp ngoại lệ.
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) {}
}
}
Có, bạn vẫn cần tự đóng các kết nối, ngay cả khi sử dụng gộp kết nối. Đó là một sai lầm phổ biến ở những người mới bắt đầu rằng họ nghĩ rằng nó sẽ tự động xử lý khi kết thúc. Điều này không đúng . Nhóm kết nối cụ thể là trả về một kết nối được bọc thực hiện giống như sau trong hàm 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();
}
}
Không đóng chúng sẽ khiến kết nối không được giải phóng trở lại nhóm để sử dụng lại và do đó nó sẽ lấy lại một kết nối mới nhiều lần cho đến khi DB hết kết nối, điều này sẽ khiến ứng dụng của bạn gặp sự cố.
Xem thêm:
- Tần suất nên đóng Connection, Statement và ResultSet trong JDBC?
- Sử dụng phiên bản java.sql.Connection tĩnh trong hệ thống đa luồng có an toàn không?
- Đóng kết nối JDBC trong nhóm