如果我用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);
}
答案 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对象的执行时间。