java - 如何使用 Spring 和 JDBCTemplate 取消长时间运行的查询?

标签 java spring jdbctemplate

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/

相关文章:

java - 在基于 tomcat 的 jersey 应用程序中使用 spring 核心功能

java - 同步数据结构

java - 如何删除标签和文本字段之间的空格

java - 线程中的异常 "main"org.hibernate.MappingException : invalid configuration in hibernate4

java - 如何将 java.util.Date 存储到 UTC/GMT 时区的 MySQL 时间戳字段中?

java - Thymeleaf 3.0 模板引擎,从两个位置获取模板

java - 更改 Spring Boot 使用的数据库模式

mysql - Spring Boot : Jdbc javax.net.ssl.SSLException:在接收对等方的 close_notify 之前关闭入站

java - 如果我有一个列表和一个参数值,如何使用 updateBatch 删除行?

java - Spring Transaction (@Transaction) 使用普通 JDBC,无需 JdbcTemplate