thể trùng lặp:
when to close Connection, Statement, PreparedStatement and ResultSet in JDBCThực hành tốt: Kết nối JDBC
Tôi đã viết một wrapper đơn giản cho một kết nối JDBC và nó hoạt động nhưng tôi muốn cải thiện nó với các thông lệ tốt nhất càng tốt. Về cơ bản nó có các phương pháp như open()
, close()
, isOpened()
, select()
, insert()
, update()
, delete()
và batch()
. Để đơn giản, tôi sẽ chỉ đăng ở đây 4 phương pháp đầu tiên.
public class Query{
private Connection con;
private PreparedStatement ps;
private ResultSet rs;
//Database.open() returns a Connection ready to use
public void open (Database database) throws DatabaseException, SQLException{
if (!isOpened()){
con = database.open();
}
}
public void close() throws SQLException{
if (isOpened()){
if (ps != null) ps.close();
con.close();
con = null;
}
}
public boolean isOpened(){
return con != null;
}
//The query string is the query without the word "select" and can use placeholders (?)
//The args param it's just an array owith the values of this placeholders
public ResultSet select (String query, Object[] args) throws SQLException{
if (ps != null) ps.close();
if (isOpened()){
ps = con.prepareStatement ("select " + query);
if (args != null){
for (int i=0; i<args.length; i++){
ps.setObject (i+1, args[i]);
}
}
rs = ps.executeQuery();
}
return rs;
}
}
Ghi chú:
- Các đối tượng truy vấn tương tự có thể được tái sử dụng, ví dụ như mở và đóng cửa nó, và sau khi mở một lần nữa.
- Tôi không đóng kết nối cho mỗi truy vấn, tôi chỉ đóng tuyên bố chuẩn bị (điều này là đúng hay tôi có thể rời khỏi chuẩn bị tuyên bố mở được vì đối tượng Connection sẽ đóng nó?)
- Khi tôi đóng số
Connection
, tất cả các sốPreparedStatement
s và của chúngResultSet
cũng bị đóng, phải không?
Cách sử dụng:
Database database;
//Database initialization
Query query = new Query();
query.open (database);
ResultSet rs = query.select ("* from user where name=?", new String[]{ "MyName" });
doSomethingWithResult1 (rs);
//Connection is not closed here
ResultSet rs = query.select ("coordx from point where coordy=? and coordz=?", new Float[]{ 0.1, 0.2 });
doSomethingWithResult2 (rs);
query.close();
query.open (database);
ResultSet rs = query.select ("* from user where name=?", new String[]{ "MyName" });
doSomethingWithResult1 (rs);
//Connection is not closed here
ResultSet rs = query.select ("coordx from point where coordy=? and coordz=?", new Float[]{ 0.1, 0.2 });
doSomethingWithResult2 (rs);
query.close();
Bạn nghĩ gì? Tôi có nên đóng và mở kết nối sau mỗi truy vấn không? Tôi có thể để mở PreparedStatement sau mỗi truy vấn trên cùng một kết nối không? Đó là một thiết kế tốt?
Kết nối đóng và mở lại cho mỗi truy vấn là một ý tưởng tồi. Thực hiện một kết nối thực sự, thực sự tốn kém. – bdares
Sau đó, tôi có thể để mở PreparedStatement hay tôi nên đóng nó cho mọi truy vấn? –
Bạn có thể để mọi thứ mở cho đến khi bạn thực sự được thực hiện bằng cách sử dụng DB. Đóng một kết nối sẽ theo dõi và đóng tất cả các công cụ (câu lệnh, resultsets) mà nó sinh ra. – bdares