每次调用execute()后,我应该关闭并创建一个新语句吗?

时间:2015-04-10 06:08:50

标签: java jdbc

如果我用JDBC创建一个语句并执行一个查询,我是否需要在再次执行之前关闭所述语句并创建一个新语句? Eclipse没有抱怨第二种情况。

try {
        connection = dataSource.getConnection();

        try {
            statement = connection.createStatement();
            statement.execute("set search_path to '...'");
        } finally {
            Utils.tryClose(statement);
        }

        try {
            statement = connection.createStatement();
            statement.execute("SET statement_timeout TO " + (QUERY_TIMEOUT_SECONDS * 1000));
        } finally {
            Utils.tryClose(statement);
        }

        try {
            statement = connection.createStatement();
            statement.execute(query);
        } finally {
            Utils.tryClose(statement);
        }
} finally {
    Utils.tryClose(connection);
}

相反:

try {
    connection = dataSource.getConnection();

    statement = connection.createStatement();
    statement.execute("set search_path to '...'");
    statement.execute("SET statement_timeout TO " + (QUERY_TIMEOUT_SECONDS * 1000));
    statement.execute(query);
} finally {
    Utils.tryClose(statement);
    Utils.tryClose(connection);
}

1 个答案:

答案 0 :(得分:3)

这不是必需的,您可以使用相同的语句多次查询数据库,唯一要记住的是,在创建新的statemnet后,将关闭每个返回语句执行的结果集。引自java docs: -

  

默认情况下,每个Statement对象只能同时打开一个ResultSet对象。因此,如果读取一个ResultSet对象与另一个ResultSet对象的读取交错,则每个ResultSet对象必须由不同的Statement对象生成。 Statement接口中的所有执行方法都隐式关闭一个语句的当前ResultSet对象(如果存在一个打开的对象)。

因此你可以这样做: -

try {
     connection = dataSource.getConnection();

     statement = connection.createStatement();
     ResultSet rs1=statement.execute("....");

     //parse rs1
     //close rs1

     ResultSet rs2= statement.execute(....);
     //parse rs1
     //close rs1

  } finally {
    Utils.tryClose(statement);
    Utils.tryClose(connection);
  }

我不确定为什么eclipse在PreparedStatements的情况下抱怨,PreparedStatements的全部目的是定义查询结构并通过仅更改参数多次执行查询。例如,当您要解析大型文本文件并将其插入数据库时​​。引自javadocs

  

如果要多次执行Statement对象,通常会减少使用PreparedStatement对象的执行时间。