본문 바로가기

개발세상/java

dbcp2 connection timeout, jdbc :: mybatis 타임아웃 설정

728x90
반응형

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 발생하는 것을 확인 할 수 있었다. 굳굳

이렇게 또 하나 배운다. (성공)

 

 

728x90
반응형