我遇到一个问题,当我查询 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/