我只是想知道我是否声明ArrayList<PreparedStatement> ps = new ArrayList<>();
并使用此方法添加语句。
public void addQuery(String query){
try{
Connection con = connect();
PreparedStatement p = con.prepareStatement(query);
ps.add(p);
} catch (Exception e){
}
}
如果我调用ArrayList<>
方法,是否会关闭存储在ps.clear
中的连接和PreparedStatements?我试过这个
public void addQuery(String query){
try(Connection con = connect(); PreparedStatement p = con.prepareStatement(query);){
ps.add(p);
}
}
但是当我执行PreparedStatements
中存储的ArrayList<>
时,我收到了错误
声明关闭后不允许任何操作。
最好的办法是什么?
答案 0 :(得分:2)
连接和
PreparedStatements stored in the
ArrayList&lt;&gt;will be closed if I call the
ps.clear()`方法?
没有。清除数组与数组包含的内容无关。但是,一旦您关闭它们或创建它们的连接,所有准备好的语句都将被关闭,这是由于try-with资源语句而发生的,这就是您获得该异常的原因。
这也是没有意义的原因。
准备语句的一个重点是为连接池或JDBC驱动程序或数据库服务器本身提供缓存它们的机会。你不需要自己做。
答案 1 :(得分:0)
首先, try / catch 块中的PreparedStatement与ps列表中的相同。将对象添加到列表时,它不会被复制,列表保存对原始对象的引用。因此,当您关闭连接时,它会在任何地方关闭。
其次,'ps.clear()'不会关闭您的连接,它只是从列表中删除对您的连接对象的引用,因此您不能依赖clear()
关闭您的连接。希望这可以帮助。