【问题标题】:ArrayList of PreparedStatementsPreparedStatements 的 ArrayList
【发布时间】:2017-08-02 12:59:23
【问题描述】:

我只是想知道我是否声明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){

    }
}

如果我调用ps.clear 方法,存储在ArrayList<> 中的连接和PreparedStatements 是否会被关闭?我试过这个

public void addQuery(String query){
    try(Connection con = connect(); PreparedStatement p = con.prepareStatement(query);){
            ps.add(p);
    }
}

但是当我执行存储在ArrayList<> 中的PreparedStatements 时,我得到了错误

语句关闭后不允许任何操作。

最好的办法是什么?

【问题讨论】:

  • 最好的办法是忘记将PreparedStatements 放在列表中。我不知道你想用它来实现什么,但它没有任何意义,只会让你的代码变得不必要地复杂。
  • 从不写catch (Exception e){ }总是正确处理异常
  • 这听起来是个糟糕的方法。还记得你遇到的最后一个问题吗?你只是让你的代码更脆弱。在开始发明自己的“聪明”解决方案之前,请尝试使用标准习语。
  • @UsagiMiyamoto ArrayList.clear() 与 PreparedStatement.close() 完全无关。
  • @SedrickJefferson 仅关于标题。实际问题与答案完全不同。

标签: java jdbc arraylist


【解决方案1】:

是否连接和PreparedStatements stored in theArrayListwill be closed if I call theps.clear()`方法?

没有。清除数组与数组包含的内容无关。但是,一旦您关闭它们或创建它们的连接,所有准备好的语句都将被关闭,这是由于 try-with 资源语句而发生的,这就是您得到该异常的原因。

这也是为什么这是毫无意义的。

prepared statements 的重点之一是为连接池、JDBC 驱动程序或数据库服务器本身提供缓存它们的机会。你不需要自己做。

【讨论】:

  • 那么存储在ArrayList的preparedStatement中的连接如何关闭呢?
  • 通过 try-with-resources 声明,正如我已经明确指出的那样。该语法没有其他目的,只是为了确保资源在退出时关闭。如果您不知道它的作用,很难理解为什么要使用它。
【解决方案2】:

首先,try/catch 块中的 PreparedStatement 与您的 ps 列表中的相同。当您将对象添加到列表时,它不会被复制,列表包含对原始对象的引用。因此,当您关闭连接时,它会到处关闭。

其次,'ps.clear()' 不会关闭您的连接,它只是从列表中删除对您的连接对象的引用,因此您不能依赖clear() 关闭您的连接。希望这可以帮助。

【讨论】:

    猜你喜欢
    • 2013-03-14
    • 1970-01-01
    • 2010-10-15
    • 2010-09-24
    • 2013-06-01
    • 1970-01-01
    • 2010-09-18
    • 1970-01-01
    相关资源
    最近更新 更多