ID Generation서비스를 위한 EgovTableIdGnrService의 getNextStringId의 중복발생
- 작성자 :
- 천*환
- 작성일 :
- 2014-02-07 15:53:28
- 조회수 :
- 925
- 구분 :
- 공통컴포넌트
- 진행상태 :
- 완료
Q
공통컴포넌트중 로그관련하여 syslog 와 weblog를 운영환경에서 부하테스트시 간헐적으로 로깅테이블에 간헐적으로 pk 중복에러가
발생하는 증상이 있었습니다.
운영환경에서 발생하는 경우라 일단 운영환경에서 log관련 aop와 관련 bean 을 제거하고 운영중입니다.
하여 본 게시판 검색과 소스확인하며 원인을 분석하던 중
EgovTableIdGnrService.allocateIdBlock 메소드를 살펴보니 선 select 후 update 구조로서 되어있더군요
이런 구조로 멀티쓰레드 환경에서의 고려로 해당 메소드 진입전 syncronize 블럭 처리가 되어있고요
그런데 만일 클러스터링 환경 같이 여러개의 컨텍스트로 서비스되는 경우에 같은 db 값을 참조할 수 있어 보입니다.
block size 를 높인다면 db 액세스를 낮추어 이런 경합으로 인한 문제를 회피하게 할 수 있지만
순서가 보장되어야 된다면 block size 를 1로 할 수 밖에 없는 구조겠지요
하여 저는 지금 선 update 후 select 구조로의 변경을 해 row level lock 을 유도하여 무결성을 유지하도록 변경해볼 생각입니다.
(저희 dbms는 oracle 11g입니다 ^^)
본 게시판을 참조하다 보니 id gen 버전을 2.6.1로 변경하라는 내용이 있던데 저희는 이미 2.6.1을 적용한 상태입니다.
혹시 이 문제에 대한 다른 처리방안이나 의견 조언 부탁드립니다.
발생하는 증상이 있었습니다.
운영환경에서 발생하는 경우라 일단 운영환경에서 log관련 aop와 관련 bean 을 제거하고 운영중입니다.
하여 본 게시판 검색과 소스확인하며 원인을 분석하던 중
EgovTableIdGnrService.allocateIdBlock 메소드를 살펴보니 선 select 후 update 구조로서 되어있더군요
이런 구조로 멀티쓰레드 환경에서의 고려로 해당 메소드 진입전 syncronize 블럭 처리가 되어있고요
그런데 만일 클러스터링 환경 같이 여러개의 컨텍스트로 서비스되는 경우에 같은 db 값을 참조할 수 있어 보입니다.
block size 를 높인다면 db 액세스를 낮추어 이런 경합으로 인한 문제를 회피하게 할 수 있지만
순서가 보장되어야 된다면 block size 를 1로 할 수 밖에 없는 구조겠지요
하여 저는 지금 선 update 후 select 구조로의 변경을 해 row level lock 을 유도하여 무결성을 유지하도록 변경해볼 생각입니다.
(저희 dbms는 oracle 11g입니다 ^^)
본 게시판을 참조하다 보니 id gen 버전을 2.6.1로 변경하라는 내용이 있던데 저희는 이미 2.6.1을 적용한 상태입니다.
혹시 이 문제에 대한 다른 처리방안이나 의견 조언 부탁드립니다.
A
안녕하세요. 천주환님
클러스터링 테스트환경을 구성하기가 어려운 관계로 말씀하신 부분에 대한 테스트는 어려움이 있습니다.
관련 부분에 대한 해결 방법은 지속적으로 확인해 보겠습니다.
고맙습니다.
클러스터링 테스트환경을 구성하기가 어려운 관계로 말씀하신 부분에 대한 테스트는 어려움이 있습니다.
관련 부분에 대한 해결 방법은 지속적으로 확인해 보겠습니다.
고맙습니다.