我想知道以下代码片段的最佳实践是什么,每次在'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();
}
}
答案 0 :(得分:3)
恕我直言,您应该在方法完成后关闭语句和结果集(在最后),但每次重新使用它时关闭ResultSet
也应该在完成连接时始终关闭连接。
编辑:重新初始化
ResultSet set = statement.executeQuery();
set = statement2.executeQuery();
您正在将ResultSet“set”设置为新的结果集。原始集合现在没有指向任何东西,但仍然等待收集。
答案 1 :(得分:2)
您应该关闭所有数据库资源:
答案 2 :(得分:1)
我认为你应该考虑阅读“提高JDBC性能的最佳实践”这篇文章。
答案 3 :(得分:1)
从Java 7开始,您可以使用try-with-resources,它清楚地标记了Connection
,Statement
和ResultSet
的范围并自动关闭它们。您的方法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就是这样一个包。