1

我在生产中运行了很长时间的查询,因为哪些连接被关闭/放弃了。结果,我将 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");
}
4

0 回答 0