새소식

반응형
Java/Spring

org.springframework.dao.RecoverableDataAccessException 에러

  • -
반응형

DBCP(DataBase Connection Pool) wait_timeout 에러 관련한

org.springframework.dao.RecoverableDataAccessException 에러

 

### Error querying database.  Cause: com.mysql.cj.jdbc.exceptions.CommunicationsException: Communications link failure

The last packet successfully received from the server was 7,625,858 milliseconds ago.  The last packet sent successfully to the server was 7,625,864 milliseconds ago.
### The error may exist in com/one/plus/mapper/task/TaskMapper.java (best guess)
### The error may involve defaultParameterMap
### The error occurred while setting parameters

...이하 생략

 

구글 번역기를 돌렸을 경우 아래와 같이 나온다.

서버에서 성공적으로 수신된 마지막 패킷은 7,625,858밀리초 전입니다. 서버에 성공적으로 전송된 마지막 패킷은 7,625,864밀리초 전입니다.

 

mysql은 기본 wait_timeout(8시간)동안 사용했던 DB 커넥션이 활동하지 않으면 강제로 끊어버린다.

이미 끊어져버린 커넥션을 사용하도록 반환 했으니 에러가 발생하게 된다.

즉, 기본시간인 8시간 동안 사용하지 않아 끊어진 상태에서 다시 사용하려는 경우 발생한다.

 

해당 에러를 해결하기 위해선 커넥션 풀 설정에서 설정값을 추가해주면 된다.

 

설정값 추가하기 전 Spring Boot DB 커넥션 풀 설정은 아래와 같다.

 

@Autowired
Environment env;

@Bean(destroyMethod = "close")
public DataSource dataSource() {
    BasicDataSource bds = new BasicDataSource();
    bds.setDriverClassName(env.getProperty("jdbc.driverClassName"));
    bds.setUrl(env.getProperty("jdbc.url"));
    bds.setUsername(env.getProperty("jdbc.username"));
    bds.setPassword(env.getProperty("jdbc.password"));
    bds.setInitialSize(1);
    bds.setMaxActive(100);
    bds.setMaxIdle(10);
    bds.setMaxWait(30000);

    return bds;
}

 

@PropertySource를 통해서 classpath에 있는 db 파일에서 DB연결에 필요한 driverClassName, url, id, pw를 불러온다.

 

 

에러를 해결하기 위한 커넥션 풀 설정값 추가

@Autowired
Environment env;


@Bean(destroyMethod = "close")
public DataSource dataSource() {
    BasicDataSource bds = new BasicDataSource();
    bds.setDriverClassName(env.getProperty("jdbc.driverClassName"));
    bds.setUrl(env.getProperty("jdbc.url"));
    bds.setUsername(env.getProperty("jdbc.username"));
    bds.setPassword(env.getProperty("jdbc.password"));
    bds.setInitialSize(1);
    bds.setMaxActive(100);
    bds.setMaxIdle(10);
    bds.setMaxWait(30000);

    bds.setValidationQuery("SELECT 1");
    bds.setTestOnBorrow(true);
    bds.setTestOnReturn(false);
    bds.setTestWhileIdle(true);
    bds.setTimeBetweenEvictionRunsMillis(60000);
    return bds;
}

 

속성 설명
InitialSize 최초 커넥션 풀 생성할때 커넥션 풀에 채워 넣을 커넥션 개수
maxActive 동시에 사용할 수 있는 최대 커넥션 개수(기본 : 8)
maxIdle 커넥션 풀에 반납할 때 최대로 유지될 수 있는 커넥션 개수(기본 : 8)
maxWait 커넥션 풀에 연결 가능한 커넥션이 없을 경우 반납되는 커넥션을 대기하는 시간
(단위 : millisecond, 10,000ms = 10초), 위 설정 값은 30000은 30초
validationQuery DB 커넥션의 유효성 검사(예-"SELECT 1", mysql 기준)
testOnBorrow 커넥션 풀에서 커넥션을 얻어올 때 테스트 실행(기본 : True)
testOnReturn 커넥션 풀에 커넥션을 반환할 때 테스트 실행(기본 : False)
testWhileIdle Evictor 스레드가 실행될 때(timeBetweenEvictionRunMillis>0) 커넥션 풀 안에 있는
커넥션을 대상으로 테스트 실행(기본 : False)

 

반응형
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.