728x90
tmax.tibero.jdbc.comm.tbstream.readnbytes tibero-jdbc-6.jar sysdate failed jdbc-90700 해결 방법
tmax.tibero.jdbc.comm.tbstream.readnbytes JDBC-90700 오류 해결 방법
오류 분석
com.tmax.tibero.jdbc.comm.TbStream.readNBytes에서 발생하는 JDBC-90700 오류는 Tibero 서버와의 통신 스트림이 네트워크 불안정, 서버 리소스 고갈, 또는 연결 타임아웃으로 인해 중단되었음을 나타냅니다. 특히 sysdate failed가 함께 발생하면 Tibero 서버가 특정 쿼리 응답을 제대로 전송하지 못한 상태입니다.
근본 원인 (Root Cause)
-
네트워크 스트림 중단: 대량 파일 업로드로 인한 네트워크 리소스 고갈
-
서버 세션 타임아웃: Tibero 서버의 SESSION_TIMEOUT 초과
-
연결 풀 고갈: JEUS6의 JDBC 커넥션 풀에서 연결 상태 불일치
-
TCP Keep-Alive 미설정: 장시간 유휴 연결에 대한 네트워크 장비의 세션 해제
해결방법 (우선순위 순)
즉각 조치 (운영 중단 없이)
1. JEUS6 데이터소스 타임아웃 설정 증가
JEUS6의 JDBC 데이터소스 설정에서 타임아웃을 증가시킵니다:
xml
Copy
<!-- jeus.xml 또는 domain.xml -->
<datasource>
<name>TiberoDS</name>
<classname>com.tmax.tibero.jdbc.TbDriver</classname>
<url>jdbc:tibero:thin:@{DB_IP}:8629:{SID}</url>
<username>{USERNAME}</username>
<password>{ENCRYPTED_PASSWORD}</password>
<connection-pool>
<min-pool-size>5</min-pool-size>
<max-pool-size>100</max-pool-size> <!-- 최대 연결 수 증가 -->
<connection-timeout>60000</connection-timeout> <!-- 기본 30초 → 60초 증가 -->
<idle-timeout>300000</idle-timeout> <!-- 유휴 타임아웃 5분 설정 -->
<test-connections-on-reserve>true</test-connections-on-reserve> <!-- **핵심 설정** -->
<test-table-name>SYS.DUAL</test-table-name> <!-- 연결 검증용 테이블 -->
</connection-pool>
</datasource>
핵심 설정 설명:
-
test-connections-on-reserve: 커넥션 풀에서 연결을 가져올 때 유효성 검사 수행
-
test-table-name: SELECT 1 FROM SYS.DUAL 쿼리로 연결 테스트
2. Tibero JDBC URL에 소켓 타임아웃 파라미터 추가
JDBC URL에 직접 타임아웃 관련 파라미터를 설정합니다:
java
Copy
// JDBC URL 형식
String url = "jdbc:tibero:thin:@{DB_IP}:8629:{SID}" +
"?connectTimeout=60000" + // 연결 시도 타임아웃 (60초)
"&socketTimeout=60000" + // 소켓 읽기 타임아웃 (60초)
"&self_keepalive=true" + // TCP Keep-Alive 활성화 (Tibero 6+)
"&self_keepidle=30" + // Keep-Alive 시작 시간 (30초)
"&self_keepintvl=10" + // Keep-Alive 간격 (10초)
"&self_keepcnt=3"; // Keep-Alive 재시도 횟수 (3회)
Tibero 6 JDBC 전용 파라미터:
-
self_keepalive: Tibero 6부터 지원되는 자체 Keep-Alive 기능
-
self_keepidle/keepintvl/keepcnt: TCP Keep-Alive 설정 오버라이드
중기 대응 (서버 설정 변경)
3. Tibero 서버 TB_CONFIG.PAR 파일 수정
Tibero 서버의 설정 파일에서 세션 타임아웃을 조정합니다:
properties
Copy
# $TB_HOME/config/TB_CONFIG.PAR
# 세션 타임아웃 증가 (기본 3600초 → 7200초)
SESSION_TIMEOUT = 7200
# 최대 세션 수 증가 (기본 100 → 200)
MAX_SESSION = 200
# 네트워크 버퍼 크기 증가
NET_BUFFER_SIZE = 8192 # 기본 4096 → 8192로 증가
# Keep-Alive 설정 (OS 레벨)
TCP_KEEPALIVE = YES
4. Oracle Solaris 11.4 TCP Keep-Alive 설정
Solaris OS 레벨에서 TCP Keep-Alive 설정을 강화합니다:
bash
Copy
# 현재 설정 확인
ndd -get /dev/tcp tcp_keepalive_interval
ndd -get /dev/tcp tcp_keepalive_abort_interval
# 설정 변경 (일시적)
ndd -set /dev/tcp tcp_keepalive_interval 30000 # 30초 (기본 2시간)
ndd -set /dev/tcp tcp_keepalive_abort_interval 60000 # 60초 (기본 8분)
# 영구 설정을 위한 /etc/system 파일 편집
echo "set tcp:tcp_keepalive_interval = 30000" >> /etc/system
echo "set tcp:tcp_keepalive_abort_interval = 60000" >> /etc/system
# 재부팅 후 적용
reboot
장기 대응 (애플리케이션 코드 개선)
5. JDBC 연결 검증 로직 추가
JEUS6 애플리케이션에서 연결 획득 전 검증 로직을 추가합니다:
java
Copy
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import javax.sql.DataSource;
public class TiberoConnectionValidator {
public static Connection getValidatedConnection(DataSource ds) throws SQLException {
Connection conn = null;
int retryCount = 0;
int maxRetries = 3;
while (retryCount < maxRetries) {
try {
conn = ds.getConnection();
// 연결 검증 쿼리 실행 (Tibero 전용)
try (PreparedStatement pstmt = conn.prepareStatement("SELECT SYS_DATE FROM DUAL");
ResultSet rs = pstmt.executeQuery()) {
if (rs.next()) {
// SYS_DATE 조회 성공 → 유효한 연결
return conn;
}
}
} catch (SQLException e) {
retryCount++;
if (conn != null) {
try { conn.close(); } catch (SQLException ex) {}
}
if (retryCount >= maxRetries) {
throw new SQLException("Tibero 연결 검증 실패 (재시도 초과)", e);
}
try {
Thread.sleep(1000 * retryCount); // 1초, 2초, 3초 간격 재시도
} catch (InterruptedException ie) {
Thread.currentThread().interrupt();
}
}
}
throw new SQLException("유효한 Tibero 연결을 획득할 수 없습니다");
}
}
6. 대량 파일 업로드 시 JDBC 연결 격리
대량 파일 업로드와 일반 쿼리를 분리하여 리소스 경쟁을 방지합니다:
java
Copy
// 파일 업로드 전용 데이터소스 설정
@Resource(name = "jdbc/FileUploadDS")
private DataSource fileUploadDS;
// 일반 쿼리용 데이터소스
@Resource(name = "jdbc/GeneralDS")
private DataSource generalDS;
// 파일 업로드 시 전용 연결 사용
public void processLargeFileUpload(InputStream fileStream) {
// 파일 업로드에는 긴 타임아웃을 가진 전용 연결 사용
Connection uploadConn = fileUploadDS.getConnection();
try {
// 대량 데이터 처리
processFile(uploadConn, fileStream);
} finally {
uploadConn.close(); // 반드시 명시적 종료
}
}
진단 및 검증 방법
Step 1: 현재 연결 상태 모니터링
bash
Copy
# Tibero 서버의 현재 세션 상태 확인
$ tbSQL -s sys/tibero
SQL> SELECT SID, USERNAME, STATUS, LOGON_TIME, LAST_CALL_ET
FROM V$SESSION
WHERE USERNAME = 'YOUR_APP_USER';
# 오래된 세션 강제 종료 (필요 시)
SQL> ALTER SYSTEM KILL SESSION 'sid,serial#';
Step 2: JEUS6 로그에서 오류 패턴 분석
bash
Copy
# JEUS6 로그에서 JDBC-90700 오류 추적
$ grep -A 5 -B 5 "JDBC-90700" $JEUS_HOME/domains/domain1/servers/server1/logs/jeus.log
# 스택 트레이스 확인
$ grep -A 10 "tbstream.readNBytes" $JEUS_HOME/domains/domain1/servers/server1/logs/jeus.log
Step 3: 네트워크 패킷 추적 (Solaris)
bash
Copy
# snoop 명령어로 Tibero 포트(8629) 패킷 추적
$ sudo snoop -d {network_interface} -o /tmp/tibero_trace.snoop port 8629
# 추적 파일 분석
$ snoop -i /tmp/tibero_trace.snoop -V | grep -E "CONNECT|RESET|TIMEOUT"
긴급 복구 절차 (운영 장애 시)
-
JEUS6 서버 재시작 (연결 풀 초기화)bashCopy
$ jeusadmin -u admin -p password -c "stop-server server1" $ jeusadmin -u admin -p password -c "start-server server1" -
Tibero 리스너 재시작 (필요 시)bashCopy
$ tbsvrctl stop $ tbsvrctl start -
커넥션 풀 플러시bashCopy
# JEUS Admin Console 또는 jeusadmin CLI $ jeusadmin -u admin -p password [MASTER]domain1.adminServer> flush-connection-pool --datasource TiberoDS
최종 검증 체크리스트
-
[ ] JDBC URL에 socketTimeout=60000 추가
-
[ ] JEUS6 데이터소스에 test-connections-on-reserve=true 설정
-
[ ] Tibero TB_CONFIG.PAR에서 SESSION_TIMEOUT=7200 설정
-
[ ] Solaris TCP Keep-Alive 간격 30초로 조정
-
[ ] 애플리케이션에 연결 검증 로직 구현
-
[ ] tibero-jdbc-6.jar이 JEUS6/lib/system에 배포됨
-
[ ] 방화벽/네트워크 장비에서 세션 타임아웃 60분 이상 설정
이렇게 하면 대량 파일 업로드로 인한 네트워크 리소스 고갈 시에도 Tibero 연결이 안정적으로 유지되고, JDBC-90700 오류가 해결됩니다.
728x90
'컴퓨터 활용(한글, 오피스 등) > 기타' 카테고리의 다른 글
| 안내서 해설서 (0) | 2025.12.16 |
|---|---|
| TCP Keep-Alive란 무엇이고 Oracle Solaris 11.4에서 설정하는 방법 (0) | 2025.12.16 |
| JEUS6 과도한 액티브 상태 진단 및 리포트 수집 가이드 (0) | 2025.12.16 |
| 연차사용촉진제도 운영 시 알아야 할 노무수령 거부 방법과 주의사항 총 정리 (0) | 2025.12.12 |
| 노무거부권 (0) | 2025.12.12 |