java - 需要捕获 JdbcTemplate.setQueryTimeout 的超时情况

标签 java spring jdbctemplate

我遇到一个问题,当我查询 mysql 服务器时,它有时会挂起,有时会完全关闭。我使用 spring JdbcTemplate 连接到它。我看到JdbcTemplate有一个setTimeout方法,但我不知道如何检查是否发生超时。我这样调用它:

try {
    JdbcTemplate template = new JdbcTemplate(dataSource);
    template.setQueryTimeout(3);
    SqlRowSet rs = template.queryForRowSet(sql);

} catch (DataAccessException e) {
    String msg = "Can't connect to database.";
    response.addError(msg + " " + e);
    logger.error(msg, e);
    return response;
}

我知道当数据库关闭时这可以正常工作,但我不确定如何测试查询是否由于超时而停止,或者查询是否执行良好并且没有返回记录。

增加我的问题的是,我实际上无法重现服务器现在挂起的情况,因此我无法自己进行实验。我是否应该检查某种类型的异常,或者是否会抛出 DataAccessException?或者我可以在 SqlRowSet 中检查一些内容?

最佳答案

如果您看到 Statement.executeQuery 的文档它确实定义了一个SQLTimeoutException。如果设置并超过超时(有多种条件),则会抛出此错误 - 请检查数据库驱动程序的文档。

Spring的jdbc模板在内部调用这个,java.sql异常由spring的SQLExceptionTranslator翻译进入QueryTimeoutException

我建议捕获这个异常。

关于java - 需要捕获 JdbcTemplate.setQueryTimeout 的超时情况,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39148891/

相关文章:

java - AspectJ + Gradle 配置

java - jackson 错误 com.fasterxml.jackson.databind.ser.ContainerSerializer : method <init>(Lcom/fasterxml/jackson/databind/JavaType;)V not found

java - 如何为 jdbctemplate.batchUpdate(String sql, List<Object[]> batchArgs) 包含两个参数?

Java休息API : how to check connection between client and endpoint?

c# - 你会选择什么样的设计模式?

java - Eclipse 运行配置机器名称

spring - 执行 spring web 客户端导致 DeferringLoadBalancerExchangeFilterFunction 非限定 bean 异常

java - spring中注入(inject)抽象类的问题

java - 使用 SimpleJdbcTemplate 干净地创建域对象的对象图

spring - JdbcTemplate - 替换问号