현상
특정 쿼리 수행 시, SIGSEGV가 발생합니다.
단일 SQL, 프로시저, 혹은 BEGIN ~ END 블록 내에서 바인드 파라미터를 과도하게 사용한 경우 오류가 발생할 수 있습니다.
[sys.log]
[06-09T07:00:48.762168] [FRM-751] [I] Signal 'SIGSEGV'(11) caught (TID = 751, OS_THR_ID = 28530, PID = 25799): si_addr = 0000000100000001 : the cause of the signal can be found in a process callstack file.
[06-09T07:00:54.099932] [FRM-751] [I] THROW. ec=ERROR_SESS_KILLED(-12001) [ Session has been closed. ] (csr_id:12) [tbsvr_signal.c:1618:sync_sig_handler]
...
[tbsvr.out]
[751] *** 2024/06/09 07:00:48.762 *** Signal 11 (SIGSEGV) caught (TID = 751, SESSID = 751, OS_THR_ID = 28530, PID = 25799): si_addr = 0000000100000001 : the cause of the signal can be found in a process callstack file.
[751] Thread stack: 00007f09fc72f000--00007f09fcf3f000
[751] client : ip [65.130.11.36] process [JDBC Thin Client] logon time : [2024/06/09 06:50:38]
...
[751] current sql : "BEGIN
INSERT INTO SYMPHONY.EX_B10_DEPARTMENT (
DN
, CN
, DEPARTMENTNUMBER
, EPCOMPANYDOMAIN
, EPDEPTLEVEL
, EPDEPTORDER
, EPENDEPARTMENT
, EPENHIGHDEPTNAME
, EPENMANAGERNAME
, EPENMANAGERTITLE
, EPENORGANIZATIONNAME
, EPENSUBORGNAME
, EPHIGHDEPTNAME
, EPHIGHDEPTNUMBER
, EPINDEPTCODE
, EPLOWDEPT
, EPMANAGERID
, EPMANAGERNAME
, EPMANAGERTITLE
, EPORGANIZATIONNUMBER
, EPORGMAKEDATE
, EPPREFERREDLANGUAGE
, EPSUBORGCODE
, EPSUBORGNAME
, O
, OU
, TIMESTAMP
) VALUES (
?
, ?
, ?
, ?
, ?
, ?
, ?
, ?
, ?
, ?
, ?
, ?
, ?
, ?
, ?
, ?
, ?
, ?
, ?
, ?
, ?
, ?
, ?
, ?
, ?
, ?
, sysdate
);
...
COMMIT;
END;
SQL
복사
원인
하나의 INSERT 문에는 26개의 바인드 파라미터가 사용되었으나, BEGIN ~ END 블록 내에서 5000개 이상의 INSERT 문이 하나의 SQL(PSM)로 처리되어 전체 바인드 파라미터 개수가 65,535개를 초과하여 오류가 발생합니다.
해결
단일 SQL 문에서 사용되는 바인드 파라미터의 총 개수가 65,535개를 초과하지 않도록 아래와 같이 쿼리를 수정하여 해결합니다.
•
단건 INSERT 수행 후, 일정 건수 단위로 COMMIT 처리
•
JDBC 사용 시, autocommit=false로 설정 후 batch update 수행