[英]What's the best practice for JDBC connection/resultset/statement
我想知道以下代碼片段的最佳實踐是什么,每次在每個“if”內完成 executeQuery 時,我是否必須關閉所有 stmt 和 rs,或者我可以像現在一樣,在 runOnSqlServer 結束時關閉 rs 和 stmt ,並在運行方法結束時關閉連接? 感謝您的任何指點!
public void runOnSqlServer(Connection con, String[] params, String db){
try{
Statement stmt = con.createStatement();
ResultSet rs = null;
if(isVer){
rs = stmt.executeQuery(micro_verSql);
commonAct(rs, getParameter("isVer"), 1);
}
if(isInfo){
rs = stmt.executeQuery("SELECT DATABASEPROPERTYEX('"+db+"', 'COLLATION')");
commonAct(rs, getParameter("isInfo"), 1);
}
}catch(SQLException){
.....
}finally{
stmt.close();
rs.close();
}
}
public void run(CommandContext ctx) {
try{
...
runOnSqlServer(con, params, sqldb);
...
}catch(Exception ex){
}finally{
if (con != null) con.close();
}
}
恕我直言,您應該在方法完成后(在最后)關閉語句和結果集,但是每次重新使用它時都關閉ResultSet
,您也應該在完成后始終關閉連接。
編輯:重新初始化
ResultSet set = statement.executeQuery();
set = statement2.executeQuery();
您正在將 ResultSet“集”設置為新的結果集。 原來的集合現在沒有指向任何東西,但仍然打開等待收集。
您應該關閉所有數據庫資源:
從 Java 7 開始,您可以使用try-with-resources ,它清楚地標記了您的Connection
、 Statement
和ResultSet
的 scope 並自動關閉它們。 您的方法runOnSqlServer(…)
可能如下所示:
public void runOnSqlServer(Connection con, String[] params, String db){
try (Statement stmt = con.createStatement()) {
if(isVer){
try (ResultSet rs = stmt.executeQuery(micro_verSql)) {
commonAct(rs, getParameter("isVer"), 1);
} // rs is closed here
}
if(isInfo){
try (ResultSet rs = stmt.executeQuery("SELECT DATABASEPROPERTYEX('"+db+"', 'COLLATION')")) {
commonAct(rs, getParameter("isInfo"), 1);
} // rs is closed here
}
} // stmt is closed here
catch(SQLException){
.....
}
// finally not necessary, as rs and stmt are closed automatically
}
附帶說明:除非您確定db
不是從用戶輸入派生的,否則不要使用諸如"SELECT DATABASEPROPERTYEX('"+db+"', 'COLLATION')"
類的結構。 連接字符串以構建 SQL 語句易受SQL 注入的影響。 請改用PreparedStatement
。
我認為您應該考慮閱讀“提高 JDBC 性能的最佳實踐”下的這篇文章。
正如其他人所提到的,使用finally
來確保項目關閉非常重要。
此外,考慮使用連接池來降低頻繁打開和關閉連接的成本。 c3p0就是這樣一種 package。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.