WAS에서 DB 커넥션상태체크 후 유효하지 않은 경우 Connection Refresh 설정 적용

 
WAS(Web Application Server)에서 DB 커넥션 상태를 체크하고 유효하지 않은 경우에 Connection Refresh 설정을 적용하는 방법은 아래와 같습니다:

1. DB 커넥션 상태 체크

DB 커넥션 상태를 체크하는 방법은 여러 가지가 있습니다. 가장 일반적인 방법은 validationQuery를 사용하는 것입니다. 이는 특정한 SQL 쿼리를 통해 커넥션이 유효한지 확인하는 방법입니다.

<datasource>
    ...
    <validation-query>SELECT 1</validation-query>
    ...
</datasource>

2. Connection Refresh 설정

커넥션이 유효하지 않을 경우 커넥션 풀에서 해당 커넥션을 제거하고 새로운 커넥션을 생성하도록 설정할 수 있습니다. 이는 주로 커넥션 풀을 관리하는 라이브러리나 WAS의 설정을 통해 가능합니다.

예를 들어, Apache Tomcat의 경우 testOnBorrow와 testWhileIdle 등의 설정을 통해 비슷한 기능을 제공할 수 있습니다:

 

<Resource name="jdbc/MyDB" auth="Container" type="javax.sql.DataSource"
    ...
    validationQuery="SELECT 1"
    testOnBorrow="true"
    testWhileIdle="true"
    timeBetweenEvictionRunsMillis="30000"
    minEvictableIdleTimeMillis="60000"
    ...
/>

위 설정에서 testOnBorrow가 true로 설정되면 커넥션을 대여할 때마다 validationQuery를 실행하여 커넥션이 유효한지 확인합니다. testWhileIdle이 true로 설정되면 커넥션 풀의 유휴 상태 커넥션도 주기적으로 검증하여 유효하지 않은 커넥션을 제거합니다.

3. 추가 설정

더 나아가 특정 WAS에 따라 다양한 설정이 필요할 수 있습니다. 예를 들어, WebLogic에서는 아래와 같은 설정을 통해 유효하지 않은 커넥션을 처리할 수 있습니다:

<jdbc-data-source>
    ...
    <test-table-name>SQL SELECT 1 FROM DUAL</test-table-name>
    <test-frequency-seconds>300</test-frequency-seconds>
    <test-connections-on-reserve>true</test-connections-on-reserve>
    <test-connections-on-release>true</test-connections-on-release>
    ...
</jdbc-data-source>

각 WAS와 커넥션 풀 관리 라이브러리의 문서를 참고하여 필요한 설정을 적용하십시오. 이를 통해 커넥션 상태를 체크하고 유효하지 않은 커넥션을 적절히 처리할 수 있습니다.

------------- 기타 --------


 

WAS에서 DB 커넥션 상태 체크 후 유효하지 않은 경우 Connection Refresh 설정 적용

   
원인 키오스크 DB CPU 사용률 증가로 DB 스펙업 (4xlarge → 8xlarge)한 Stand-By DB로 Fail-over 진행 후 WAS에서 DB 커넥션 실패 발생 
-

(필수) WAS에서 DB 커넥션 상태 체크 후 유효하지 않은 경우 Connection이 Refresh 될 수 있도록  WAS DB Connection Pool 유효성 관리 옵션을 설정합니다.

Why?

WAS에서는 DB 재기동 및 Fail-over 등 DB상태 및 DB 커넥션이 비정상인 경우에는 WAS와 DB간 커넥션 상태가 유효한지 체크하고, 새로운 커넥션이 생성될 수 있도록 DB 커넥션 유효성 체크 설정이 필요합니다.
애플리케이션이 Connection을 요청했을 때 Connection을 애플리케이션에 넘겨주기 전 특정 쿼리를 수행하여 Connection의 상태를 점검(validation)하는 기능으로, JDBC Connection 내부 에러로 인한 끊김, 방화벽에 의한 소켓 끊김 현상 등을 체크할 때 유용합니다.
Connection의 상태에 이상이 있는 경우 Connection을 DB로부터 새로 받아 애플리케이션에 전달합니다. 만약 RAC를 위한 클러스터 데이터소스에 속한 데이터소스라면 반드시 이 설정을 해야 합니다.

 Activity

WAS에서 DB connection Pool의 커넥션 유효성을 관리하는 주요 옵션을 적용하여 DB 커넥션을 관리해야합니다.



📖 [Tomcat] DB connection Pool 관리 옵션

✔connection 유효성 관리 주요 옵션
  • testOnBorrow
  • testWhileIdle
  • validationQuery
  • validationQueryTimeout
  • validationInterval
※ tomcat jdbc-pool 공식문서 : https://tomcat.apache.org/tomcat-9.0-doc/jdbc-pool.html
 

📖 [WebLogic] DB connection Pool 관리 옵션

✔connection 유효성 관리 주요 옵션
  • Test Frequency
  • Test Table Name
  • Connection Reserve Timeout
  • Inactive Connection Timeout 
※ WebLogic jdbc-pool 공식문서 : https://docs.oracle.com/cd/E13222_01/wls/docs81/ConsoleHelp/domain_jdbcconnectionpool_config_connections.html
(WebLogic 버전별로 URL 상이)

 

📖 [JEUS] DB connection Pool 관리 옵션

✔connection 유효성 관리 주요 옵션
  • Check Query
  • Check Query Timeout
  • Non Validation Interval
  • Check Query Period
  • Destroy Policy On Check Query
※ JEUS jdbc-pool 공식문서 : https://technet.tmaxsoft.com/upload/download/online/jeus/pver-20211006-000001/server/chapter_datasource.html#sect_datasource_and_connection_pool_management_in_domain
 

근본원인
키오스크 DB CPU의 급격한 증가 (80%  98.8%)에 따라 스펙업DB로 Fail-over하여 WAS에서 JDBC Connection이 비정상적인 상태에서 JDBC connection pool에서 커넥션을 얻어올 때 커넥션 유효성 체크하는 검증 옵션 미설정으로, 비정상 커넥션이 refresh 되지 않았음 
  •  발생 오류 로그 : Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to obtain JDBC Connection; nested exception is java.sql.SQLException: Cannot get a connection, pool error Timeout waiting for idle object, borrowMaxWaitDuration=PT10S
   
 
 
 

 

+ Recent posts