Java8使用resource/JDBC/Play框架进行尝试:这是否正确?
我已经使用try with resources重写了一个Play2/JDBC查询,但我不确定这是否正确。 第一个try块处理连接和PrepareStatement。第二次尝试处理结果集 理论上,连接、语句和结果集在任何情况下都将正确关闭?是这样吗?还是我错过了需要处理的事情Java8使用resource/JDBC/Play框架进行尝试:这是否正确?,java,jdbc,playframework,try-with-resources,Java,Jdbc,Playframework,Try With Resources,我已经使用try with resources重写了一个Play2/JDBC查询,但我不确定这是否正确。 第一个try块处理连接和PrepareStatement。第二次尝试处理结果集 理论上,连接、语句和结果集在任何情况下都将正确关闭?是这样吗?还是我错过了需要处理的事情 public static List<Item> findBySimpleSQL(String where, java.lang.Object... params) { List<Item> co
public static List<Item> findBySimpleSQL(String where, java.lang.Object... params) {
List<Item> collection = new ArrayList<Item>();
try (Connection connection = play.db.DB.getConnection();
PreparedStatement pstmt = connection.prepareStatement("SELECT * FROM items WHERE "+where);)
{
int pos = 1;
for (java.lang.Object o : params) {
if (o instanceof Integer) {pstmt.setInt(pos, (int) o);}
if (o instanceof Long) {pstmt.setLong(pos, (long) o);}
if (o instanceof String) {pstmt.setString(pos, (String) o);}
pos++;
}
try (ResultSet rs = pstmt.executeQuery()) {
while (rs.next()) collection.add(parse(rs));
}
} catch (Exception e) {
Logger.error("Error message: "+e);
}
return collection;
}
-将日志记录添加到catch块。来自Oracle的:
资源是程序运行后必须关闭的对象
结束了。try with resources语句确保每个
资源在语句末尾关闭。任何物体
实现java.lang.AutoCloseable,其中包括
实现java.io.Closeable,可以用作资源
在您的例子中,Connection、PreparedStatement和ResultSet都实现了AutoCloseable接口,因此答案是:
是的,他们将被正确关闭。对任何情况都不确定,编码和绝对不能很好地相处
您可能希望阅读上述链接,并确保正确捕获可能的异常。有一件事肯定是错误的:永远不要将捕获块保留为空……特别是如果它捕获的只是ExcepionI签出的链接,请尝试使用资源。下面是一个显示JDBC用法的示例。现在我想知道为什么他们不把ResultSet放在一个try with resources块中。有人说你必须关闭结果集,但我发现了这个:。因此,似乎没有必要在ResultSet周围使用try块。有什么评论吗?好吧,还是要看情况而定。假设您希望在处理完ResultSet后重用预编译的PreparedStatement。在这种情况下,ResultSet应该放在它自己的try with resource中。或者PreparedStatement被参数化并在for循环中使用。。。或连接、语句和结果集之间的交互并不像人们想象的那样是线性的。我们还应该考虑JDBC驱动程序的实现,以及conn、stmt和rs是垃圾收集的事实,至少它们是垃圾收集的……您需要额外的澄清吗?或者我们可以关闭这个?