gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 13:57:21 25 4
gpt4 key购买 nike

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com