以下哪项是正确的(或者是否重要)。
Connection conn = null;
conn = DriverManager.getConnection (url, userName, password);
Statement st = conn.createStatement();
while (a.b()) {
st.executeUpdate(blah blah); // same statement with different data values
}
st.close();
conn.close();
finally
{
if (conn != null)
{
try
{
conn.close ();
}
catch (Exception e) { }
}
}
}
或
Connection conn = null;
conn = DriverManager.getConnection (url, userName, password);
while (a.b()) {
Statement st = conn.createStatement();
st.executeUpdate(blah blah); //same statement with different data values
st.close();
}
conn.close();
finally
{
if (conn != null)
{
try
{
conn.close ();
}
catch (Exception e) { }
}
}
}
答案 0 :(得分:2)
如果循环内的更新重用完全相同的语句,则首选表单。相反,如果语句随着每次迭代而改变,那么你就会陷入第二种形式。
答案 1 :(得分:2)
实际上,您应该使用PreparedStatement with placeholders并且只在第一个示例中创建一次语句。
答案 2 :(得分:2)
在循环之外创建语句更简洁,可能会更快,但您需要进行分析以查看它是否会对您的情况产生很大影响。
如果循环使用不同的数据值做同样的事情,我希望PreparedStatement获得速度。
答案 3 :(得分:2)
我不认为上述情况会有很大的不同 - 如果有足够的工作让它长时间保持开放,你想关闭声明 - 如根据文件:
立即释放此Statement对象的数据库和JDBC资源,而不是等待它自动关闭时发生。通常,最好在完成资源后立即释放资源,以避免占用数据库资源。
除非您的SQL发生更改,否则最好使用PreparedStatement,而不是使用您指定的第一种方式。
答案 4 :(得分:1)
两者都不正确。假设您没有重复执行完全相同的查询,但它们具有不同的值,那么您应该使用(单个)PreparedStatement,其查询具有占位符并在每次循环迭代时提供不同的值。
在Java端使用预准备语句会更有效(通过减少对象创建和GC成本)。它还可以减少数据库端的负载,具体取决于JDBC驱动程序的工作方式。
另一点是您需要在finally
的{{1}}子句中关闭PreparedStatement和Connection。如果不这样做并抛出异常,那么您的代码将泄漏数据库连接。这可能会在以后引起问题。