dbcp2 connection timeout, jdbc :: mybatis 타임아웃 설정
제목은 중구난방이지만, 내가 하다가 발견한 내용 써본다.
Springboot에서 mysql을 mybatis 통해서 사용.
그리고 아파치에서 제공하는 org.apache.commons.dbcp2.BasicDataSource를 사용하고 있다.
(아래내용 참고)
spring.datasource.type=org.apache.commons.dbcp2.BasicDataSource
spring.datasource.dbcp2.initial-size=100
spring.datasource.dbcp2.max-idle=250
spring.datasource.dbcp2.min-idle=100
spring.datasource.dbcp2.max-total=250
spring.datasource.dbcp2.max-wait-millis=10000
spring.datasource.dbcp2.remove-abandoned-timeout=60
spring.datasource.dbcp2.validation-query=SELECT 1
spring.datasource.dbcp2.test-on-borrow=false
spring.datasource.dbcp2.test-while-idle=true
spring.datasource.dbcp2.time-between-eviction-runs-millis=9000
spring.datasource.dbcp2.num-tests-per-eviction-run=5
근데 DB 끊겼다고 생각하고 Timeout 설정하는 것을 찾아보다가
이것 저것 봤던 거 공유.
1. spring.datasource.dbcp2.max-wait-mills
일단은 dbcp2에서 정확하게 Connection Timeout 설정하는 것은 없는 듯 하다.
max-wait-mills 인가? 하고 봤는데, 그건 또 커넥션풀에서 커넥션을 꺼낼 때 기다리는 시간을 지정하는 것이라고 한다.
즉 DB 사용시 지정하는 Timeout 과는 무관
그래서 (실패)
2. mybatis-config.xml 내 defaultStatementTimeout
Timeout이라고 전체 검색 때려서 봤을 때, 발견한 mybatis-config.xml 소스
(하단 참고)
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<settings>
<setting name="cacheEnabled" value="true"/>
<setting name="lazyLoadingEnabled" value="true"/>
<setting name="multipleResultSetsEnabled" value="true"/>
<setting name="useColumnLabel" value="true"/>
<setting name="defaultStatementTimeout" value="25000"/>
<setting name="logPrefix" value="mybatis."/>
</settings>
</configuration>
위와 같이 소스가 되어있었는데 여기서 발견한 defaultStatementTimeout이 25초로 세팅(ms단위)
그래서 10000이라 바꾸고 실행해봤는데 안됨; (실패)
3. spring.datasource.url > jdbc:mysql URL에 설정
spring.datasource.url=jdbc:mysql://~~~~:3306/database?useSSL=false&useUnicode=true&characterEncoding=utf8&socketTimeout=10000&connectTimeout=10000
보다가 또 발견한 application.properties에 있는 spring.datasource.url 발견
여기에다가 간단하게 뒤에 socketTimeout이나 connectionTimeout을 설정해준다면 된다는 사실
https://d2.naver.com/helloworld/1321
일단은 위의 링크를 참고 하였고.
JDBC드라이버의 SocketTimeout에는 두가지 옵션이 있다고 한다. 그리고 드라이버별로 설정방법이 다르다는 것.
1. Socket Connect시 타임아웃(connectTimeout) : Socket.connect 메서드를 위한 제한 시간
2. Socket Read/Write의 타임아웃(socketTimeout) : Socket.setSoTimeout 메서드를 위한 제한시간
그래서 나는 위의 내용을 참고하여 원래 있던 내용에
&socketTimeout=10000&connectTimeout=10000 를 추가해주었다.
그러니 내가 원하는 대로 10초 이내로 timeout 발생하는 것을 확인 할 수 있었다. 굳굳
이렇게 또 하나 배운다. (성공)
'개발세상 > java' 카테고리의 다른 글
Java, 같은 패키지명 import 하기(ex.ObjectUtils) (0) | 2020.09.22 |
---|---|
maven 실행가능한 jar 파일 만들기(Executable Jar File) (0) | 2020.08.27 |
java :: SpringBoot :: quartz Scheduler 쿼츠 스케쥴러 예시 (0) | 2020.08.24 |
JAVA 클래스 파일 소스 보기, 자바 Decomplier(디컴파일) (1) | 2020.07.01 |
Java, Eclipse(STS) :: PostConstruct cannot be resolved to a type (0) | 2020.06.02 |