개요
응용프로그램에서 커넥션이 단절되는 경우와 각 상황에서의 에러 코드,메시지를 설명합니다.
적용버전
- ALTIBASE HDB 6.3.1 을 기준으로 작성 되었습니다.
- 추가사항 또는 업데이트가 필요한 경우 http://support.altibase.com/kr/ 또는 이 페이지에 댓글로 요청 글 남겨주세요.
응용프로그램에서 Connection이 단절되는 경우
다음과 같은 상황은 Connection이 되지않은 상태입니다.
- Connect를 안한 경우
- 통신소켓이상이나 서버쪽에서 연결을 끊은 경우
- 이전에 끊어진 연결을 감지 못했을 경우 (이전에 Connection이 단절된 경우)
- Timeout에 의해 끊어진 경우.
Query Timeout, Fetch Timeout, UTrans Timeout, Idle Timeout이 있으며, Query Timeout의 경우에는 Connection이 끊기지 않으나 이외에 나머지 경우는 모두 Connection이 끊어집니다. - DB Server가 종료된 경우
- DB Server가 종료되어 있어 연결은 못하는 경우 (Connect 실패)
응용프로그램별 에러 코드와 에러 메시지 확인방법
응용프로그램이 ALTIBASE Embedded SQL(APRE*C/C++) 로 작성된 경우 확인할 수 있는 값은 다음과 같습니다.
- sqlca.sqlcode (쿼리 수행 리턴값 - SQL_SUCCESS, SQL_ERROR, etc)
- sqlca.sqlerrm.sqlerrmc (에러메시지)
- SQLCODE (에러코드)
- SQLSTATE (상태코드)
응용프로그램이 SQLCLI로 작성된 경우 확인할 수 있는 값은 다음과 같습니다.
SQLError(env,dbc,stmt,state,err,msg,msgMax,msgLength) 를 호출하여 확인할수 있습니다.
- state (상태코드)
- err (에러코드)
- msg (에러메시지)
Connection 에러 상황 및 에러 메시지
Connect를 안했거나 이전에 Disconnect 한 경우
[APRE*C/C++] ==================================================== sqlca STRUCTURE .sqlcode [-2] (SQL_ERROR) .sqlerrm.sqlerrmc The connection does not exist. (Name:default connection) SQLCODE [-2] SQLSTATE ["08003"] ==================================================== [SQLCLI/ODBC] 1. 이전에 한번도 connect를 안한 경우 ==================================================== return value [-2] SQLError(env,dbc,stmt,state,err,msg,msgMax,msgLength) error state (state) [""] error number (err) [0] in Hex(0) error message (msg) [ ?] ==================================================== 2. 이전에 disconnect 한 경우 ==================================================== return value [-1] (SQL_ERROR) SQLError(env,dbc,stmt,state,err,msg,msgMax,msgLength) error state (state) ["08003"] error number (err) [331830] in Hex(51036) error message (msg) [Connection does not exist (err8)] ====================================================
Connection이 단절된 경우 (서버에서 끊었거나 네트워크 에러)
[APRE*C/C++] ==================================================== sqlca STRUCTURE .sqlcode [-1] .sqlerrm.sqlerrmc [Communication link failure('errno')] SQLCODE [-331843] in Hex(51043) SQLSTATE ["08S01"] ==================================================== [SQLCLI/ODBC] ==================================================== return value [-1] SQLError(env,dbc,stmt,state,err,msg,msgMax,msgLength) error state (state) ["08S01"] error number (err) [331843] in Hex(51043) error message (msg) [Communication link failure('errno')] ====================================================
이전에 연결이 단절된 것을 감지 못하고 다시 쿼리를 수행한 경우
[APRE*C/C++] ==================================================== sqlca STRUCTURE .sqlcode [-1] .sqlerrm.sqlerrmc [Connection does not exist (err11)] SQLCODE [-1] SQLSTATE ["08003"] ==================================================== [SQLCLI/ODBC] ==================================================== return value [-1] SQLError(env,dbc,stmt,state,err,msg,msgMax,msgLength) error state (state) ["08003"] error number (err) [331830] in Hex(51036) error message (msg) [Connection does not exist (err8)] ====================================================
Timeout에 의해 단절된 경우
Fetch Timeout, UTrans Timeout, Idle Timeout 모두 같은 에러가 리턴됨. (altibase_boot.log에 timeout 내용이 기록됨.)[APRE*C/C++] ==================================================== sqlca STRUCTURE .sqlcode [-1] .sqlerrm.sqlerrmc [Communication link failure(131)] SQLCODE [-331843] in Hex(51043) SQLSTATE ["08S01"] ==================================================== [SQLCLI/ODBC] ==================================================== return value [-1] SQLError(env,dbc,stmt,state,err,msg,msgMax,msgLength) error state (state) ["08S01"] error number (err) [331843] in Hex(51043) error message (msg) [Communication link failure(131)] ====================================================
DB Server가 종료된 경우
[APRE*C/C++] ==================================================== sqlca STRUCTURE .sqlcode [-1] .sqlerrm.sqlerrmc [Communication link failure(131)] SQLCODE [-331843] in Hex(51043) SQLSTATE ["08S01"] ==================================================== [SQLCLI/ODBC] ==================================================== return value [-1] SQLError(env,dbc,stmt,state,err,msg,msgMax,msgLength) error state (state) ["08S01"] error number (err) [331843] in Hex(51043) error message (msg) [Communication link failure(131)] ====================================================
Connect 실패
[APRE*C/C++] ==================================================== sqlca STRUCTURE .sqlcode [-1] .sqlerrm.sqlerrmc [Client unable to establish connection] SQLCODE [-327730] [50032] SQLSTATE [08001] ==================================================== [SQLCLI/ODBC] ==================================================== return value [-1] SQLError(env,dbc,stmt,state,err,msg,msgMax,msgLength) error state (state) [08001] error number (err) [327730] in Hex(50032) error message (msg) [Client unable to establish connection] ====================================================
결론
각 상황별로 에러코드로 확인한 결과 다음과 같이 3가지의 경우가 있습니다.
- SQLSTATE(state) ["08001"] SQLCODE [1(0x01)] errno [32770(0x050032)]
* connect 실패
- SQLSTATE(state) ["08003"] SQLCODE(errno) [331830(0x051036)]
* Connect를 안하고 (disconnect 한 후) 수행하는 경우
* 이미 Connect가 끊어져 있는 경우
- SQLSTATE(state) ["08S01"] SQLCODE(errno) [331843(0x051043)]
* socket 단절
* timeout에 의해 끊어진 경우
* 서버가 종료되있는 경우