개요
Fetch Timeout 메시지에 대해 설명합니다.
버전
ALTIBASE HDB 모든 버전.
현상
알티베이스 서버
알티베이스 서버 로그에서는 다음과 같은 로그를 볼 수 있습니다.
- 알티베이스 서버 로그($ALTIBASE_HOME/trc/altibase_boot.log)에서 확인합니다.
- 버전 별 출력 형태가 다르므로 아래 결과를 참고하세요.
- 로그 출력 시각, CLIENT_INFO, Caused by Query 를 종합적으로 확인하여 클라이언트 쪽 현상과 관련이 있는지 확인합니다.
ALTIBASE HDB 5 이상
ALTIBASE HDB 5 버전부터
ALTIBASE HDB 4.3.9
ALTIBASE HDB 4.3.9 의 알티베이스 서버 로그에서는 클라이언트 IP 정보를 확인할 수 없습니다. 로그 출력 시각과 Caused by Query 를 통해 판단해야 합니다.
ALTIBASE HDB 4.3.9
알티베이스 클라이언트
알티베이스 클라이언트 쪽에서 아래와 같은 현상이 발생합니다.
- 클라이언트에서 알티베이스 서버로 요청을 보내는 시점에 에러 메시지를 확인할 수 있습니다.
따라서 알티베이스 서버 측(altibase_boot.log) 에 남겨진 시각보다 이후에 발생할 수 있습니다. - SELECT 중(Fetch 요청 시) 알티베이스 서버와의 연결이 끊어집니다.
- Fetch 결과를 가지고 어플리케이션에서 처리하다가 다시 데이터베이스로 FETCH 를 요청할 때 연결이 끊긴 에러가 발생합니다.
- 클라이언트 로그에 The session has been closed by the server 메시지가 보입니다. (ALTIBASE HDB 5.5.1 이상 버전에 해당)
- 클라이언트 로그에 Server closed the connection. 메시지가 보입니다. (ALTIBASE HDB 5.5.1 이상 버전에 해당.)
클라이언트 별 에러 메시지 종류는 아래를 참고하세요.
Orange for ALTIBASE
SELECT 수행 후 아래 결과 창의 스크롤을 내릴 때 아래의 에러 메시지가 발생합니다.
Orange for ALTIBASE
iSQL
iSQL 에서 SELECT 수행 중 아래의 에러 메시지가 발생합니다.
iSQL
APRE(SESC), SQLCLI, ODBC, CAPI
APRE, SQLCLI, ODBC, CAPI 에서는 Fetch 중 Communication link failure. Server closed the connection. 이 발생합니다.
ALTIBASE HDB 5 부터 해당됩니다.
APRESQLCLI, ODBC
SESC (ALTIBASE HDB 4 ~ 5.1.5)
SESC
JDBC
ALTIBASE HDB 4.3.9 에서는 FETCH 수행 중 아래와 같이 에러가 발생하며 애플리케이션이 중단될 수 있습니다.
$ java SimpleSQL
...중략...
ENO, DNO, SALARY : 20 40020
FETCH ERROR CODE : 0
FETCH ERROR MESSAGE : Altibase JDBC $Revision: 24725 $ ERROR:read time out
java.sql.SQLException: Altibase JDBC $Revision: 24725 $ ERROR:read time out
at Altibase.jdbc.driver.cmProtocol.fireIOError(cmProtocol.java:87)
at Altibase.jdbc.driver.cmProtocolTCP.execFetch(cmProtocolTCP.java:817)
at Altibase.jdbc.driver.AltibaseConnection.execFetch(AltibaseConnection.java:298)
at Altibase.jdbc.driver.AltibaseResultSet.next(AltibaseResultSet.java:1126)
at SimpleSQL.main(SimpleSQL.java:105)ALTIBASE HDB 5 버전부터 6.1.1 까지는 FETCH 중 에러가 발생하고 이후 애플리케이션에서 알티베이스 서버로 요청을 보낼 때마다 연결 단절 에러가 발생합니다.
JDBC - ALTIBASE HDB 5, 6.1.1 발생 유형 1$ java SimpleSQL
...중략...
ENO, DNO, SALARY : 19 40021800000
ENO, DNO, SALARY : 20 40020
FETCH ERROR CODE : 0
FETCH ERROR MESSAGE : 연결이 peer에 의해 재설정됩니다. (errno:232)
java.sql.SQLException: 연결이 peer에 의해 재설정됩니다. (errno:232)
at Altibase.jdbc.driver.ex.exception(ex.java:52)
at Altibase.jdbc.driver.ex.exception(ex.java:37)
at Altibase.jdbc.driver.cmnTCP.recv(cmnTCP.java:130)
at Altibase.jdbc.driver.cmp.flush(cmp.java:247)
at Altibase.jdbc.driver.cmp.writeFetchRequest(cmp.java:1066)
at Altibase.jdbc.driver.ABConnection.writeFetchRequest(ABConnection.java:335)
at Altibase.jdbc.driver.ABResultSet.fetchPosition(ABResultSet.java:1184)
at Altibase.jdbc.driver.ABResultSet.next(ABResultSet.java:719)
at SimpleSQL.main(SimpleSQL.java:105)
sPreStmt.close ERROR CODE : 0
sPreStmt.close ERROR MESSAGE : 파이프가 손상되었습니다. (errno:32)
java.sql.SQLException: 파이프가 손상되었습니다. (errno:32)
at Altibase.jdbc.driver.ex.exception(ex.java:52)
at Altibase.jdbc.driver.ex.exception(ex.java:37)
at Altibase.jdbc.driver.cmnTCP.send(cmnTCP.java:153)
at Altibase.jdbc.driver.cmp.flush(cmp.java:246)
at Altibase.jdbc.driver.cmp.free(cmp.java:1085)
at Altibase.jdbc.driver.ABConnection.free(ABConnection.java:346)
at Altibase.jdbc.driver.ABStatement.close(ABStatement.java:174)
at SimpleSQL.main(SimpleSQL.java:133)
sCon.close ERROR CODE : 0
sCon.close ERROR MESSAGE : 파이프가 손상되었습니다. (errno:32)
java.sql.SQLException: 파이프가 손상되었습니다. (errno:32)
at Altibase.jdbc.driver.ex.exception(ex.java:52)
at Altibase.jdbc.driver.ex.exception(ex.java:37)
at Altibase.jdbc.driver.cmnTCP.send(cmnTCP.java:153)
at Altibase.jdbc.driver.cmp.flush(cmp.java:246)
at Altibase.jdbc.driver.cmp.disconnect(cmp.java:775)
at Altibase.jdbc.driver.ABConnection.close(ABConnection.java:226)
at SimpleSQL.main(SimpleSQL.java:142)JDBC - ALTIBASE HDB 5, 6.1.1 발생 유형 2$ java SimpleSQL
...중략...
ENO, DNO, SALARY : 19 40021800000
ENO, DNO, SALARY : 20 40020
FETCH ERROR CODE : 331817
FETCH ERROR MESSAGE : Communication link failure
java.sql.SQLException: Communication link failure
at Altibase.jdbc.driver.ex.exception(ex.java:57)
at Altibase.jdbc.driver.ex.exception(ex.java:32)
at Altibase.jdbc.driver.ex.test(ex.java:83)
at Altibase.jdbc.driver.cmnTCP.recv(cmnTCP.java:110)
at Altibase.jdbc.driver.cmp.flush(cmp.java:253)
at Altibase.jdbc.driver.cmp.writeFetchRequest(cmp.java:1167)
at Altibase.jdbc.driver.ABConnection.writeFetchRequest(ABConnection.java:628)
at Altibase.jdbc.driver.ABResultSet.fetchPosition(ABResultSet.java:1184)
at Altibase.jdbc.driver.ABResultSet.next(ABResultSet.java:719)
at SimpleSQL.main(SimpleSQL.java:105)
sPreStmt.close ERROR CODE : 331817
sPreStmt.close ERROR MESSAGE : Broken pipe
java.sql.SQLException: Broken pipe
at Altibase.jdbc.driver.ex.exception(ex.java:76)
at Altibase.jdbc.driver.cmnTCP.send(cmnTCP.java:156)
at Altibase.jdbc.driver.cmp.flush(cmp.java:252)
at Altibase.jdbc.driver.cmp.free(cmp.java:1186)
at Altibase.jdbc.driver.ABConnection.free(ABConnection.java:655)
at Altibase.jdbc.driver.ABStatement.close(ABStatement.java:179)
at SimpleSQL.main(SimpleSQL.java:134)
Caused by: java.io.IOException: Broken pipe
at sun.nio.ch.FileDispatcher.write0(Native Method)
at sun.nio.ch.SocketDispatcher.write(SocketDispatcher.java:29)
at sun.nio.ch.IOUtil.writeFromNativeBuffer(IOUtil.java:69)
at sun.nio.ch.IOUtil.write(IOUtil.java:26)
at sun.nio.ch.SocketChannelImpl.write(SocketChannelImpl.java:336)
at Altibase.jdbc.driver.cmnTCP.send(cmnTCP.java:147)
... 5 more
sCon.close ERROR CODE : 331817
sCon.close ERROR MESSAGE : Broken pipe
java.sql.SQLException: Broken pipe
at Altibase.jdbc.driver.ex.exception(ex.java:76)
at Altibase.jdbc.driver.cmnTCP.send(cmnTCP.java:156)
at Altibase.jdbc.driver.cmp.flush(cmp.java:252)
at Altibase.jdbc.driver.cmp.disconnect(cmp.java:877)
at Altibase.jdbc.driver.ABConnection.close(ABConnection.java:366)
at SimpleSQL.main(SimpleSQL.java:143)
Caused by: java.io.IOException: Broken pipe
at sun.nio.ch.FileDispatcher.write0(Native Method)
at sun.nio.ch.SocketDispatcher.write(SocketDispatcher.java:29)
at sun.nio.ch.IOUtil.writeFromNativeBuffer(IOUtil.java:69)
at sun.nio.ch.IOUtil.write(IOUtil.java:26)
at sun.nio.ch.SocketChannelImpl.write(SocketChannelImpl.java:336)
at Altibase.jdbc.driver.cmnTCP.send(cmnTCP.java:147)
... 4 moreALTIBASE HDB 6.3.1 부터는 FETCH 수행 중 The session has been closed by the server 에러 메시지가 발생하고 알티베이스 서버로 요청을 보낼 때마다 연결 단절 에러가 발생합니다.
JDBC - ALTIBASE HDB 6.3.1FETCH ERROR CODE : 4163
FETCH ERROR MESSAGE : The session has been closed by the server
java.sql.SQLException: The session has been closed by the server
at Altibase.jdbc.driver.ex.Error.processServerError(Error.java:320)
at Altibase.jdbc.driver.AltibaseForwardOnlyResultSet.next(AltibaseForwardOnlyResultSet.java:151)
at SimpleSQL.main(SimpleSQL.java:105)
sPreStmt.close ERROR CODE : 334337
sPreStmt.close ERROR MESSAGE : Communication link failure: There was no response from the server, and the channel has reached end-of-stream.
java.sql.SQLException: Communication link failure: There was no response from the server, and the channel has reached end-of-stream.
at Altibase.jdbc.driver.ex.Error.throwSQLExceptionInternal(Error.java:162)
at Altibase.jdbc.driver.ex.Error.throwSQLException(Error.java:102)
at Altibase.jdbc.driver.cm.CmChannel.readFromSocket(CmChannel.java:1042)
at Altibase.jdbc.driver.cm.CmChannel.receivePacket(CmChannel.java:1001)
at Altibase.jdbc.driver.cm.CmChannel.sendAndReceive(CmChannel.java:821)
at Altibase.jdbc.driver.cm.CmProtocol.freeStatement(CmProtocol.java:424)
at Altibase.jdbc.driver.AltibaseStatement.close(AltibaseStatement.java:436)
at SimpleSQL.main(SimpleSQL.java:133)
sCon.close ERROR CODE : 334337
sCon.close ERROR MESSAGE : Communication link failure: Broken pipe
java.sql.SQLException: Communication link failure: Broken pipe
at Altibase.jdbc.driver.ex.Error.throwCommunicationErrorException(Error.java:237)
at Altibase.jdbc.driver.cm.CmChannel.sendPacket(CmChannel.java:921)
at Altibase.jdbc.driver.cm.CmChannel.sendAndReceive(CmChannel.java:819)
at Altibase.jdbc.driver.cm.CmProtocol.disconnect(CmProtocol.java:95)
at Altibase.jdbc.driver.AltibaseConnection.disconnect(AltibaseConnection.java:616)
at Altibase.jdbc.driver.AltibaseConnection.close(AltibaseConnection.java:601)
at SimpleSQL.main(SimpleSQL.java:142)
Caused by: java.net.SocketException: Broken pipe
at java.net.SocketOutputStream.socketWrite0(Native Method)
at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:109)
at java.net.SocketOutputStream.write(SocketOutputStream.java:153)
at java.nio.channels.Channels$WritableByteChannelImpl.write(Channels.java:292)
at Altibase.jdbc.driver.cm.CmChannel.sendPacket(CmChannel.java:916)
... 5 more
원인
세션 매니저(SessionManager) 가 FETCH_TMEOUT 에 걸린 세션을 정리하면서 남기는 알림성 메시지입니다.
FETCH_TMEOUT 는 알티베이스 서버 프로퍼티로 SELECT 문을 수행하는 시간이 길어짐에 따라 DBMS 의 자원이 비정상적으로 증가하는 것을 막기 위하여 제공하는 프로퍼티입니다.
클라이언트에서 Fetch 요청하면 DBMS는 Fetch 결과를 일정량씩(통신 버퍼에) 나누어 클라이언트에게 전송합니다. 클라이언트는 통신 버퍼에 담긴 결과셋을 모두 읽으면 다음 결과셋을 DB 서버로 요청합니다.
다음 결과셋을 요청하는 시간 간격이 FETCH_TIMEOUT 설정 값을 초과할 경우 세션을 정리하고 수행 중이던 트랜잭션은 롤백됩니다.
변경 트랜잭션에서 생성한 old image 를 조회 트랜잭션에서 바라보고 있을 경우 변경 트랜잭션이 종료해도 old image 가 정리되지 않습니다.
이런 이유로 SELECT 문이 장시간 수행될 경우 아래와 같이 현상이 발생할 수 있습니다.
- 메모리 테이블의 경우 메모리 사용량 증가
- 디스크 테이블의 경우 언두 테이블스페이스 사용량 증가
조치
응용 프로그램 로직 확인
- FETCH_TIMEOUT은 주로 응용 프로그램에서 Fetch 결과를 가공하여 다른 작업을 수행하는데 이 처리 시간이 길어지는 경우 문제가 될 수 있습니다.
따라서, 응용 프로그램에서 Fetch 결과를 어떻게 처리하는 지 살펴보고 개선의 여지가 있는 지 파악 후 조치해야 합니다. ( 아래와 같은 부분이 있는 지 확인 후 조치)
JDBC 예ARPE 예
FETCH_TIMEOUT 설정 값 변경
- FETCH_TIMEOUT 프로퍼티 기본값은 60초입니다. 운영 환경 상 이 값이 작다고 판단되는 경우 변경하여 사용할 수 있습니다.
- 이 프로퍼티는 시스템 프로퍼티 또는 세션 프로퍼티로 변경할 수 있습니다.
세션 프로퍼티 변경
세션 프로퍼티는 세션 단위로, ALTER SESSION 을 수행한 세션에서 적용되며 ALTER SESSION 을 수행한 이후에 수행된 쿼리에 적용됩니다.
iSQL - 세션 프로퍼티 변경 방법어플리케이션에서도 변경할 수 있습니다.
JDBC 예APRE/SESC 예
시스템 프로퍼티 변경
시스템 프로퍼티는 ALTER SYSTEM 을 수행 이후 접속된 세션에 영향을 미칩니다.
iSQL - 시스템 프로퍼티 변경 방법변경한 시스템 프로퍼티 값을 알티베이스 서버 프로세스를 재 시작한 후에도 유지하려면 altibase.properties 파일을 수정해야 합니다.
iSQL - 시스템 프로퍼티 변경 방법
FETCH_TIMEOUT 프로퍼티 값 확인 방법
세션에 적용된 프로퍼티 값 확인 방법
FETCH_TIMEOUT 은 세션 단위로도 변경이 가능하기 때문에 세션마다 설정된 값이 다를 수 있습니다.
세션에 설정된 프로퍼티 값은 V$SESSION 에서 확인할 수 있습니다.세션에 적용된 프로퍼티 값 확인 방법시스템 프로퍼티 값 확인
ALTER SYSTEM 으로 변경하거나 altibase.properties 에 설정한 값은 V$PROPERTY 에서 확인 가능합니다.세션에 적용된 프로퍼티 값 확인 방법