FTh*_*son 13 java mysql database jdbc
在Java中使用JDBC时,通常接受的查询数据库的方法是获取连接,从该连接创建语句,然后从该语句执行查询.
// load driver
Connection con = DriverManager.getConnection(..);
Statement stmt = con.createStatement();
ResultSet result = stmt.executeQuery("SELECT..");
// ...
Run Code Online (Sandbox Code Playgroud)
但是,我不确定如何处理对同一数据库的第二个查询.
可以在同一个Statement对象上安全地执行另一个查询,还是必须从该Connection对象创建另一个语句才能执行另一个查询?
如果同一个Statement对象可以用于多个查询,那么Statement该类的目的是什么(因为它Connection.executeQuery()对于存在的方法更有意义)?
是的,您可以重用该Statement对象,但关闭ResultSet返回的对象executeQuery已经打开了结果集.
有关说明,请参阅javadoc
默认情况下,每个Statement对象只能同时打开一个ResultSet对象.因此,如果读取一个ResultSet对象与另一个ResultSet对象的读取交错,则每个ResultSet对象必须由不同的Statement对象生成.如果存在打开的对象,则Statement接口中的所有执行方法都会隐式关闭该语句的当前ResultSet对象.
所以发生以下情况:
// load driver
Connection con = DriverManager.getConnection(..);
Statement stmt = con.createStatement();
ResultSet result = stmt.executeQuery("select ..");
// do something with result ... or not
ResultSet result2 = stmt.executeQuery("select ...");
// result is now closed, you cannot read from it anymore
// do something with result2
stmt.close(); // will close the resultset bound to it
Run Code Online (Sandbox Code Playgroud)
例如,您可以在jTDS项目中找到Statement的开源实现.在Statement.executeQuery()方法中,您可以看到一个调用,initialize()它将关闭所有已打开的结果集
protected void initialize() throws SQLException {
updateCount = -1;
resultQueue.clear();
genKeyResultSet = null;
tds.clearResponseQueue();
// FIXME Should old exceptions found now be thrown instead of lost?
messages.exceptions = null;
messages.clearWarnings();
closeAllResultSets();
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
13366 次 |
| 最近记录: |