간헐적 트랜잭션 끊김 문제..
- 작성자 :
- 김*원
- 작성일 :
- 2021-03-12 15:29:08
- 조회수 :
- 10,306
- 구분 :
- 기타
- 진행상태 :
- 완료
Q
Controller 및 Service단에서 모든 DB INSERT가 완료된 이후에 트랜잭션 Commit에서 간헐적으로 에러가 발생하고 있습니다.
transactionManager.commit(status); // ERROR
간헐적으로 에러가 발생하여 테스트시 정상동작하여 문제 재현도 되지않고.. 마지막 단계인 commit 전까지 모두 로직이 타지는 걸로 보아 소스상에는 문제가 없어보이는데..
아래의 에러로그를 보면 ms-sql서버 연결이 닫혔다고 나옵니다.. INSERT처리는 문제가 없는데 찰나의 순간에 어떻게 연결이 끊길수가 있는지..
[ 에러 ]
2021-03-07 17:15:53,674 WARN [org.springframework.jdbc.support.SQLErrorCodesFactory] - Error while extracting database product name - falling back to empty error codes
org.springframework.jdbc.support.MetaDataAccessException: Error while extracting DatabaseMetaData; nested exception is com.microsoft.sqlserver.jdbc.SQLServerException: 연결이 닫혔습니다.
[ Exception 처리단에서의 에러 ] - 커넥션 연결이 끊겨서 commit처리가 제대로 되지않아 exception처리 단에서도 rollback처리가 되지 않습니다.
2021-03-07 17:15:53,684 INFO [kr.go.dnsm.mobile.reservation.MobileReservationController] - ##reservation 4-1 : Rollback : 처리 시작
org.springframework.dao.DataAccessResourceFailureException:
### Error flushing statements. Cause: com.microsoft.sqlserver.jdbc.SQLServerException: Connection reset
[ 트랜잭션 설정 ]
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
[ DBCP 설정 부분 ]
<bean id="dataSource4" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="com.microsoft.sqlserver.jdbc.SQLServerDriver"/>
<property name="url" value="jdbc:sqlserver://~~~~~~~:4613;DatabaseName=????????"/>
<property name="username" value="???????"/>
<property name="password" value="???????"/>
</bean>
소스설정 문제인지.. DB서버 문제인지도 감이 잡히고 있지 않는데 문제 해결을 위해 다방면으로 점검해야될 사항이나 참고사항 알고계시다면 답변 받아보고 싶습니다.
transactionManager.commit(status); // ERROR
간헐적으로 에러가 발생하여 테스트시 정상동작하여 문제 재현도 되지않고.. 마지막 단계인 commit 전까지 모두 로직이 타지는 걸로 보아 소스상에는 문제가 없어보이는데..
아래의 에러로그를 보면 ms-sql서버 연결이 닫혔다고 나옵니다.. INSERT처리는 문제가 없는데 찰나의 순간에 어떻게 연결이 끊길수가 있는지..
[ 에러 ]
2021-03-07 17:15:53,674 WARN [org.springframework.jdbc.support.SQLErrorCodesFactory] - Error while extracting database product name - falling back to empty error codes
org.springframework.jdbc.support.MetaDataAccessException: Error while extracting DatabaseMetaData; nested exception is com.microsoft.sqlserver.jdbc.SQLServerException: 연결이 닫혔습니다.
[ Exception 처리단에서의 에러 ] - 커넥션 연결이 끊겨서 commit처리가 제대로 되지않아 exception처리 단에서도 rollback처리가 되지 않습니다.
2021-03-07 17:15:53,684 INFO [kr.go.dnsm.mobile.reservation.MobileReservationController] - ##reservation 4-1 : Rollback : 처리 시작
org.springframework.dao.DataAccessResourceFailureException:
### Error flushing statements. Cause: com.microsoft.sqlserver.jdbc.SQLServerException: Connection reset
[ 트랜잭션 설정 ]
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
[ DBCP 설정 부분 ]
<bean id="dataSource4" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="com.microsoft.sqlserver.jdbc.SQLServerDriver"/>
<property name="url" value="jdbc:sqlserver://~~~~~~~:4613;DatabaseName=????????"/>
<property name="username" value="???????"/>
<property name="password" value="???????"/>
</bean>
소스설정 문제인지.. DB서버 문제인지도 감이 잡히고 있지 않는데 문제 해결을 위해 다방면으로 점검해야될 사항이나 참고사항 알고계시다면 답변 받아보고 싶습니다.
환경정보
-
- OS 정보 : Red Hat Enterprise Linux Server release 6.5 (Santiago)
- 표준프레임워크 버전 :
- JDK(JRE) 정보 : 1.6
- WAS 정보 : JEUS 6.0
- DB 정보 : ORACLE, MS-SQL
- 기타 환경 정보 :
A
안녕하세요.
표준프레임워크센터입니다.
일단 설정상에서 조금 이상해보이는점은 transactionManager 에 주입하신 dataSource 입니다.
첨부하신 dbcp 설정부분의 id를 dataSource4 라고 설정을 하셨는데, 주입한 dataSource의 id는 dataSource 입니다. 이 부분 확인해보셔야 할 것 같구요.
만약 비즈니스 로직 부분에서 다중db를 사용하고 있는 경우라면,
즉 여러개의 dataSource, TransactionManager를 사용해야하는 상황이시라면 ChainedTransactionManager 를 사용하여 다수의 TransactionManager 를 체인형태로 하나로 연결하여 사용하시길 바랍니다.
그리고 간헐적으로 커넥션이 끊어지는 현상은 네트워크의 장애나 다른 문제로 인해 언제든지 발생할 수 있는 현상입니다.
그래서 이런 문제를 해결하기위해 사용하는 옵션이 있는데, dbcp 에서 커넥션을 가져다 사용하기전에 커넥션이 정상적으로 연결되어있는지 체크하는 옵션 (validationQuery) 이 있습니다.
만약 커넥션이 정상이 아니라면 다시 연결을 시도합니다. 대략 아래와 같이 해당 옵션을 적용하실 수 있습니다.
<property name="validationQuery" value="select 1" />
<property name="testWhileIdle" value="true" />
<property name="timeBetweenEvictionRunsMillis" value="60000" />
위 옵션들에 대해서 알아보신 후 적용해보시기 바랍니다.
감사합니다.
표준프레임워크센터입니다.
일단 설정상에서 조금 이상해보이는점은 transactionManager 에 주입하신 dataSource 입니다.
첨부하신 dbcp 설정부분의 id를 dataSource4 라고 설정을 하셨는데, 주입한 dataSource의 id는 dataSource 입니다. 이 부분 확인해보셔야 할 것 같구요.
만약 비즈니스 로직 부분에서 다중db를 사용하고 있는 경우라면,
즉 여러개의 dataSource, TransactionManager를 사용해야하는 상황이시라면 ChainedTransactionManager 를 사용하여 다수의 TransactionManager 를 체인형태로 하나로 연결하여 사용하시길 바랍니다.
그리고 간헐적으로 커넥션이 끊어지는 현상은 네트워크의 장애나 다른 문제로 인해 언제든지 발생할 수 있는 현상입니다.
그래서 이런 문제를 해결하기위해 사용하는 옵션이 있는데, dbcp 에서 커넥션을 가져다 사용하기전에 커넥션이 정상적으로 연결되어있는지 체크하는 옵션 (validationQuery) 이 있습니다.
만약 커넥션이 정상이 아니라면 다시 연결을 시도합니다. 대략 아래와 같이 해당 옵션을 적용하실 수 있습니다.
<property name="validationQuery" value="select 1" />
<property name="testWhileIdle" value="true" />
<property name="timeBetweenEvictionRunsMillis" value="60000" />
위 옵션들에 대해서 알아보신 후 적용해보시기 바랍니다.
감사합니다.