我在生产中运行了很长时间的查询,因为哪些连接被关闭/放弃了。结果,我将 removeAbandonedTimeout 更新为 1800 秒。在此之后,95% 的问题都消失了。但是非常随机,每月一次或两次,我仍然会收到连接被放弃的错误。
这里的问题是在捕获此异常后等待 15 秒后重试无助于解决问题。随后的查询立即失败,并出现连接放弃异常。
我当前的池配置:
maxActive=50;
maxIdle=1;
minIdle=0;
initialSize=0;
maxWait=10000;
testOnBorrow=true;
testOnReturn=false;
timeBetweenEvictionRunsMillis=5000;
minEvictableIdleTimeMillis=2000;
testWhileIdle=false;
testOnConnect=false;
validationQuery=SELECT 1;
validationQueryTimeout=-1;
validationInterval=30000;
removeAbandoned=true;
removeAbandonedTimeout=1800;
logAbandoned=true;
jdbcInterceptors=ConnectionState;StatementFinalizer;ResetAbandonedTimer;
复制
使用的数据库:PostgreSQL
我removeAbandonedTimeout
改为30sec
. 第一个 pg_sleep 失败,因为它超过了超时并进入了 catch 块。我的期望是,由于后台被放弃的定时器删除了连接,下一个 pg_sleep(10) 应该请求一个新的连接,并且应该成功执行testOnBorrow
。所以我尝试让当前线程休眠 30 秒并执行下一个 pg_sleep。我的 catch 或 finally 块语句都没有执行。
try {
jdbcTemplate.execute("select pg_sleep(40)");
} catch(DataAccessException e) {
LOGGER.info(e.getMessage(), e);
Thread.sleep(30000);
jdbcTemplate.execute("select pg_sleep(10)");
LOGGER.info("Executed fall back case");
} finally {
jdbcTemplate.execute("select 1");
}