java - 如何重用 JDBC 语句并自动关闭结果集?

标签 java mysql jdbc

我正在开发一个项目,该项目将有许多语句连接到数据库 我想重用语句而不是每次连接都创建新语句 最重要的是我不想在使用后关闭每个结果集

我想在重用之前关闭语句上的结果集

我的代码看起来像这样

ArrayList<Statement> BackStatements = new ArrayList();
int lastStatementIndex = 0;

private Statement GetStatement() throws SQLException {
    Statement SM;
    int MaxStatements = 5;
    if (BackStatements.size() < MaxStatements) {
        SM = Connection.createStatement();
        BackStatements.add(SM);
        lastStatementIndex = BackStatements.size() - 1;
    } else {
        lastStatementIndex = lastStatementIndex + 1;
        if (lastStatementIndex == MaxStatements) {
            lastStatementIndex = 0;
        }
        SM = BackStatements.get(lastStatementIndex);
     /// i want to close resultset generated by SM now and i do this before return this SM
        SM.getResultSet().close();

    }

    System.out.println("Last Index:" + lastStatementIndex + "---- Size:" + BackStatements.size());
    return SM;
}

但是此方法通过记录器返回此错误

Caused by: java.sql.SQLException: ResultSet already requested

最佳答案

总的来说,这是个坏主意。语句是一个接口(interface),实际的类可以是 JDBC 驱动程序返回的任何内容。 一般来说,您不能将一个语句类重用于另一种类型。例如, CallableStatement 和PreparedStatement(对于oracle JDBC)不兼容。

对于 ResultSet,关闭它会释放数据库游标,至少在某些情况下是这样。推迟 resultSet.close() 会对数据库服务器容量产生负面影响。

一般来说,如果您的 JDBC 驱动程序支持连接池,那么就应该这样做。一般来说,网络往返比创建语句的成本要高得多。

关于java - 如何重用 JDBC 语句并自动关闭结果集?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44922265/

相关文章:

java - 即使已初始化,也会出现 "Variable data not initialized"错误

java - 递归 - 数字按相反顺序排列

java - 在 java 中构建 URL 字符串时出错

java - 是否可以在 Java 8 流 API 中定义可选流或类似异常的行为?

php - 自定义网站 VS Drupal/Joomla/Wordpress

mysql - SELECT 不同日期的记录 SQL

java - 为什么我的Tomcat只打开8个JDBC连接

java - 如何在Apache Drill中实现Mongo Storage Plugin的INNER JOINS(下推)优化?

mysql - 当我添加表中已存在的产品时,数据库中的数量值未更新

Python从MySQL中由Latin1_swedish_ci编码的数据库检索数据