JDBC java.sql.Statement
类有一个 cancel()
方法。这可以在另一个线程中调用以取消当前正在运行的语句。
如何使用 Spring 实现这一点?我找不到在运行查询时获取对语句的引用的方法。我也找不到类似取消的方法。
这里有一些示例代码。想象一下这需要长达 10 秒的时间来执行,有时根据用户的请求,我想取消它:
final int i = simpleJdbcTemplate.queryForInt("select max(gameid) from game");
我将如何修改它以便引用 java.sql.Statement
对象?
最佳答案
让我简化 oxbow_lakes 的回答:您可以使用查询方法的 PreparedStatementCreator
变体来访问语句。
所以你的代码:
final int i = simpleJdbcTemplate.queryForInt("select max(gameid) from game");
应该变成:
final PreparedStatement[] stmt = new PreparedStatement[1];
final int i = (Integer)getJdbcTemplate().query(new PreparedStatementCreator() {
public PreparedStatement createPreparedStatement(Connection connection) throws SQLException {
stmt[0] = connection.prepareStatement("select max(gameid) from game");
return stmt[0];
}
}, new ResultSetExtractor() {
public Object extractData(ResultSet resultSet) throws SQLException, DataAccessException {
return resultSet.getString(1);
}
});
现在要取消,您只需调用
stmt[0].cancel()
您可能希望在实际运行查询之前将对 stmt
的引用提供给其他线程,或者只是将其存储为成员变量。否则,你不能真正取消任何东西......
关于java - 如何使用 Spring 和 JDBCTemplate 取消长时间运行的查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1054642/