PreparedStatements的ArrayList

时间:2017-08-02 12:59:23

标签: java jdbc arraylist

我只是想知道我是否声明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<>时,我收到了错误

  

声明关闭后不允许任何操作。

最好的办法是什么?

2 个答案:

答案 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()关闭您的连接。希望这可以帮助。