JDBC引入了一个名为 closeOnAutoCompletion 的方法,当所有相关的resultSet都关闭时,它声明它会关闭语句。
我有一个创建预备语句的方法
public final PreparedStatement statement(Connection connection) throws SQLException {
PreparedStatement stmt = connection.prepareStatement(query, ResultSet.TYPE_FORWARD_ONLY,
ResultSet.CONCUR_READ_ONLY);
stmt.closeOnCompletion();
return stmt;
}
不,我是按照以下方式调用此方法
@Test
public void testCloseOnCompletionSemiManually() throws SQLException {
PreparedStatement stmt = shards.statement(db);
assertTrue("Statement must be closeOnAutoCompletion", stmt.isCloseOnCompletion());
try (ResultSet rs = stmt.executeQuery()) {
while (rs.next()) {
//System.out.println("Shard id: " + rs.getInt("SHARD_ID"));
}
}
assertTrue("Statement must be closed after all results sets have been processed", stmt.isClosed());
}
由于语句未关闭,最后一次检查失败。
由于mysql的实现,这是一个问题吗?或者我错过了解JavaDoc。
更新:我使用的是版本5.1.24
感谢, 缪奇
答案 0 :(得分:2)
驱动程序尚不支持,但测试也不正确。请注意,Statement的API文档说closeOnCompletion()在所有依赖结果集关闭时关闭语句,而不是滚动到结尾,所以我不确定实际上假设发生了什么行为在你的情况下。
答案 1 :(得分:-1)
根据this announcement,MySQL Connector / J的版本5.1.21(MySQL的JDBC驱动程序的官方名称)应该支持 closeOnAutoCompletion 。你能检查一下你使用的是那个版本吗?