Java JDBC连接/resultset/statement的最佳实践是什么

Java JDBC连接/resultset/statement的最佳实践是什么,java,jdbc,Java,Jdbc,我想知道以下代码片段的最佳实践是什么,每次在每个“if”中执行executeQuery时,我是否必须关闭所有stmt和rs,或者我是否可以像现在一样,在RunnSqlServer的末尾关闭rs和stmt,在run方法的末尾关闭连接?谢谢你的指点 public void runOnSqlServer(Connection con, String[] params, String db){ try{ Statement stmt = con.createStatement();

我想知道以下代码片段的最佳实践是什么,每次在每个“if”中执行executeQuery时,我是否必须关闭所有stmt和rs,或者我是否可以像现在一样,在RunnSqlServer的末尾关闭rs和stmt,在run方法的末尾关闭连接?谢谢你的指点

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

总之,在finally中完成方法后,您应该关闭语句和结果集,但是每次重新使用它时都应该关闭结果集,并且在完成连接后,您应该始终关闭连接

编辑:重新初始化

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

您正在将结果集设置为新的结果集。原来的集合现在没有指向任何东西,但仍然打开等待收集。

< P>我认为您应该考虑在最佳实践中阅读这篇文章,以提高JDBC中的性能。
您应该关闭所有数据库资源:

在创建它们的方法范围中。 按与创造相反的顺序 在最后一个街区 单独包装在try/catch块中。
正如其他人所提到的,使用finally来确保项目已关闭非常重要

也可以考虑使用连接池来减轻频繁打开和关闭连接的成本。就是这样一个包。

从Java 7开始,您可以使用它,它清楚地标记连接、语句和结果集的范围,并自动关闭它们。您的方法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
}

作为旁注:除非您确定数据库不是从用户输入派生的,否则不要使用诸如selectdatabasepropertyEx“+db+”、“COLLATION”之类的结构。连接字符串以生成SQL语句易受攻击。改为使用。

一个家伙告诉我,每次我调用executeQuery方法并将结果分配给ResultSet obj,比如rs,我必须先关闭这个rs,然后再由另一个新的查询执行结果分配它,这是真的和必要的吗?一个家伙告诉我,每次我调用executeQuery方法并将结果分配给ResultSet obj,比如rs,在另一个新的查询执行结果分配它之前,我必须关闭这个rs,这是真的和必要的吗?如果你重新初始化它,是的,你应该关闭它,因为它将保持打开状态,直到GC拾取它为止。但是从我在代码中看到的情况来看,您并没有这样做,所以您只需要在最后关闭它。这是没有必要的,但如果还有很多剩余,可能会导致问题open@Even,实际上,在查找了一点之后,也许最好在RS的第二个if语句中添加一个null检查,如果它不是null,则在重新设置之前关闭它。重新初始化是什么意思?你能不能给我一个简单的例子来说明这个案例,谢谢!哦,这基本上意味着在每次调用executeQuery之后,我仍然必须关闭rs,只要它不为null,在大多数情况下不为null。。。