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

Ste*_*eod 13 java spring jdbctemplate

JDBC java.sql.Statement类有一个cancel()方法.这可以在另一个线程中调用以取消当前运行的语句.

如何使用Spring实现这一目标?我无法找到在运行查询时获取对语句的引用的方法.我也找不到类似取消的方法.

这是一些示例代码.想象一下这需要10秒才能执行,有时根据用户的要求,我想取消它:

    final int i = simpleJdbcTemplate.queryForInt("select max(gameid) from game");
Run Code Online (Sandbox Code Playgroud)

我如何修改这个,所以我有一个java.sql.Statement对象的引用?

its*_*dok 12

让我简化oxbow_lakes的答案:您可以使用PreparedStatementCreator查询方法的变体来获取对语句的访问权限.

所以你的代码:

final int i = simpleJdbcTemplate.queryForInt("select max(gameid) from game");
Run Code Online (Sandbox Code Playgroud)

应该变成:

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);
    }
});
Run Code Online (Sandbox Code Playgroud)

现在取消你可以打电话

stmt[0].cancel()
Run Code Online (Sandbox Code Playgroud)

您可能希望stmt在实际运行查询之前提供对其他线程的引用,或者只是将其存储为成员变量.否则,你真的无法取消任何东西......