JDBC连接/结果集/语句的最佳实践是什么?

时间:2011-07-14 15:31:34

标签: java jdbc

我想知道以下代码片段的最佳实践是什么,每次在'if'中执行executeQuery时我是否必须关闭所有stmt和rs,或者我现在可以这样做,关闭rs和stmt at the runOnSqlServer的结束,并在结束时关闭连接运行方法?感谢您的任何指示!

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();
    }
}

5 个答案:

答案 0 :(得分:3)

恕我直言,您应该在方法完成后关闭语句和结果集(在最后),但每次重新使用它时关闭ResultSet也应该在完成连接时始终关闭连接。

编辑:重新初始化

ResultSet set = statement.executeQuery();
set = statement2.executeQuery();

您正在将ResultSet“set”设置为新的结果集。原始集合现在没有指向任何东西,但仍然等待收集。

答案 1 :(得分:2)

您应该关闭所有数据库资源:

  1. 在创建它们的方法范围内。
  2. 按创建的相反顺序
  3. 在finally块
  4. 单独包装在try / catch块中。

答案 2 :(得分:1)

我认为你应该考虑阅读“提高JDBC性能的最佳实践”这篇文章。

答案 3 :(得分:1)

从Java 7开始,您可以使用try-with-resources,它清楚地标记了ConnectionStatementResultSet的范围并自动关闭它们。您的方法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
}

作为旁注:除非您确定"SELECT DATABASEPROPERTYEX('"+db+"', 'COLLATION')"不是来自用户输入,否则不要使用db之类的结构。连接字符串以构建SQL语句易受SQL injection的攻击。请改用PreparedStatement

答案 4 :(得分:0)

正如其他人所说,使用finally确保项目已关闭非常重要。

此外,请考虑使用连接池来降低频繁打开和关闭连接的成本。 c3p0就是这样一个包。