druid 연결 탱크가 연결을 얻지 못하는 경우
jdbc.initialSize=1jdbc.minIdle=1jdbc.maxActive=5
프로그램이 일정 시간 실행된 후에 다음과 같은 예외를 던집니다.
exception=org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.exceptions.PersistenceException: ### Error querying database. Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Could not get JDBC Connection; nested exception is com.alibaba.druid.pool.GetConnectionTimeoutException: wait millis 60000, active 5, maxActive 5### The error may exist in ...
최대 연결 수가 부족한지 의심스럽습니다.
jdbc.initialSize=1jdbc.minIdle=1jdbc.maxActive=20
일정 시간 운행한 후에 또 상술한 이상이 발생했다.데이터소스 설정에 다음과 같은 매개 변수를 추가합니다 (참조http://www.cnblogs.com/netcorner/p/4380949.html):
<property name="removeAbandoned" value="true" />
<property name="removeAbandonedTimeout" value="180" />
<property name="logAbandoned" value="true" />
다음과 같은 예외를 발생시킵니다.
2016-12-27 14:35:22.773 [Druid-ConnectionPool-Destroy-1821010113] ERROR com.alibaba.druid.pool.DruidDataSource - abandon connection, owner thread: quartzScheduler_Worker-1, connected time nano: 506518587214834, open stackTrace at java.lang.Thread.getStackTrace(Thread.java:1552) at com.alibaba.druid.pool.DruidDataSource.getConnectionDirect(DruidDataSource.java:1014) at com.alibaba.druid.filter.FilterChainImpl.dataSource_connect(FilterChainImpl.java:4544) at com.alibaba.druid.filter.stat.StatFilter.dataSource_getConnection(StatFilter.java:662) at com.alibaba.druid.filter.FilterChainImpl.dataSource_connect(FilterChainImpl.java:4540) at com.alibaba.druid.pool.DruidDataSource.getConnection(DruidDataSource.java:938) at com.alibaba.druid.pool.DruidDataSource.getConnection(DruidDataSource.java:930) at com.alibaba.druid.pool.DruidDataSource.getConnection(DruidDataSource.java:102) at com.xxx.doCopyIn(AppQustionSync.java:168) at com.xxx.executeInternal(AppQustionSync.java:99) at org.springframework.scheduling.quartz.QuartzJobBean.execute(QuartzJobBean.java:75) at org.quartz.core.JobRunShell.run(JobRunShell.java:202) at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:573)
빨간색 마크업 연결이 해제되지 않았습니다. 코드를 보십시오.
try {
InputStream input = new FileInputStream(dataFile);
conn = copyInDataSource.getConnection();
baseConn = (BaseConnection) conn.getMetaData()
.getConnection();
baseConn.setAutoCommit(false);
stmt = baseConn.createStatement();
LOG.info("delete data: " + delSql);
stmt.executeUpdate(delSql);
CopyManager copyManager = new CopyManager(baseConn);
LOG.info("copy in: " + copyInSql);
copyManager.copyIn(copyInSql, input);
baseConn.commit();
jobDataMap.remove(data_file_path_key);
} catch (SQLException e) {
try {
LOG.warn(JobDataMapHelper.jobName(jobDataMap) + ":"
+ " ...");
baseConn.rollback();
} catch (SQLException ex) {
String errorMessage = String.format(
"JobName:[%s] failed: ",
JobDataMapHelper.jobName(jobDataMap));
throw new SQLException(errorMessage, ex);
}
} finally {
stmt.close();
baseConn.close();
jobDataMap.remove(data_file_path_key);
FileUtils.deleteQuietly(dataFile);
}
여기 baseConn은druid datasource를 통해 얻은 PgSQL 베이스 연결입니다. 위 코드가 실행된 후finally에서 baseConn을 호출합니다.close () 는 이 연결을 닫았습니다. (이 밑바닥 연결을 닫았을 것으로 추측되는데druid 연결 탱크는 몰랐고 자신이 이 연결을 가지고 있다고 생각했지만 실제 이 연결은 사용할 수 없습니다. 이 코드를 여러 번 실행하면 druid 연결 탱크의 모든 연결을 다 소모합니다. 그래서 Could not get JDBC Connection 오류를 냈습니다.
위finally 코드 블록을
finally {
stmt.close();
conn.close();
jobDataMap.remove(data_file_path_key);
FileUtils.deleteQuietly(dataFile);
}
즉druid 연결만 호출하는close 방법 (이 연결을 방출하는 것이지 밑바닥 연결을 직접 닫는 것이 아니다) 으로 문제가 해결됩니다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.