簡體   English   中英

JDBC 連接/結果集/語句的最佳實踐是什么

[英]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“集”設置為新的結果集。 原來的集合現在沒有指向任何東西,但仍然打開等待收集。

您應該關閉所有數據庫資源:

  1. 在創建它們的方法 scope 中。
  2. 以相反的創建順序
  3. 在 finally 塊中
  4. 單獨包裝在 try/catch 塊中。

從 Java 7 開始,您可以使用try-with-resources ,它清楚地標記了您的ConnectionStatementResultSet的 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM