Tôi đã làm xét mã (chủ yếu là sử dụng các công cụ như FindBugs) của một trong những dự án thú cưng của chúng tôi và FindBugs đánh dấu mã sau đây là sai lầm (giả):ResultSet không đóng khi kết nối đóng?
Connection conn = dataSource.getConnection();
try{
PreparedStatement stmt = conn.prepareStatement();
//initialize the statement
stmt.execute();
ResultSet rs = stmt.getResultSet();
//get data
}finally{
conn.close();
}
Các lỗi được rằng mã này có thể không giải phóng các nguồn lực . Tôi đã tìm ra rằng ResultSet và Tuyên Bố đã không đóng cửa, vì vậy tôi đóng chúng vào cuối cùng:
finally{
try{
rs.close()
}catch(SqlException se){
//log it
}
try{
stmt.close();
}catch(SqlException se){
//log it
}
conn.close();
}
Nhưng tôi gặp các mô hình trên trong nhiều dự án (từ khá một vài công ty), và không có ai ở resultsets đóng hoặc Các câu lệnh.
Bạn có gặp sự cố với ResultSets và câu lệnh không bị đóng khi đóng kết nối không?
Tôi chỉ tìm thấy this và nó đề cập đến Oracle có vấn đề với việc đóng kết quả khi đóng kết nối (chúng tôi sử dụng Oracle db, do đó sửa chữa của tôi). java.sql.api không nói gì trong Connection.close() javadoc.
tôi khuyên bạn nên sử dụng Apache commons-dbutils (http://commons.apache.org/dbutils/) Đó là một thư viện JDBC nhẹ mà thực sự dọn dẹp rất nhiều mã boilerplate JDBC. –
Đây là loại lỗi mà người dùng nhận được khi họ không đóng các đối tượng liên quan - "ORA-01000: con trỏ mở tối đa vượt quá" - http: // stackoverflow.com/questions/12192592/java-sql-sqlexception-ora-01000-maximum-open-cursors-vượt quá –
con trỏ cơ sở dữ liệu - http://stackoverflow.com/questions/3861558/what-are-the-benefits-of-using -database-cursor Con trỏ là công cụ cho phép bạn lặp lại các bản ghi trong một bộ. Nó có các khái niệm về thứ tự và bản ghi hiện tại. –