IO 오류: Got minus one from a read call 해결법
Java SQLRecoverableException: IO 오류 해결 방법 총정리!
서론: 갑자기 DB 연결이 안 된다? "IO 오류: Got minus one from a read call" 해결법은?
웹 애플리케이션을 개발하거나 운영하다 보면 예기치 못한 오류를 마주하는 경우가 많습니다. 특히 Java 애플리케이션에서 Oracle DB와 연결할 때 SQLRecoverableException: IO 오류: Got minus one from a read call
같은 오류가 발생하면 많은 개발자들이 당황하게 됩니다.😵
이 오류는 단순한 네트워크 문제일 수도 있지만, DB 설정, 커넥션 풀, 방화벽 설정 등 다양한 원인이 존재하기 때문에 빠르고 정확한 원인 파악이 필요합니다.
이번 포스팅에서는 이 오류의 원인과 해결법을 체계적으로 정리해보겠습니다. 직접적인 코드 예제와 함께 원리를 설명하니, 비슷한 문제를 겪는다면 끝까지 읽어보세요! 🛠
본론: Java SQLRecoverableException 오류 원인 및 해결책
1. 오류의 주요 원인
다음은 이 오류가 발생하는 대표적인 원인입니다.
원인 번호 | 원인 설명 |
1 | 네트워크 연결 문제: DB 서버와의 연결이 불안정함 |
2 | DB 세션 타임아웃: 오래된 커넥션이 자동 종료됨 |
3 | 방화벽 설정 문제: 특정 포트 차단으로 연결 실패 |
4 | 커넥션 풀 설정 오류: 잘못된 커넥션 풀 설정으로 오류 발생 |
5 | DB 서버 과부하: 많은 요청으로 인해 응답 불가능 |
위와 같은 원인들을 고려하여, 각각의 해결책을 살펴보겠습니다.
2. 해결 방법
✅ 1) 네트워크 연결 문제 해결
DB 연결이 불안정할 경우, Ping 테스트를 통해 연결 상태를 점검할 수 있습니다.
ping <DB_SERVER_IP
또한, Telnet을 사용하여 특정 포트(예: 1521)가 열려 있는지 확인하세요.
telnet <DB_SERVER_IP> 1521
위 명령어에서 응답이 없거나 연결이 실패하면 네트워크 담당자와 협의하여 방화벽 설정을 점검해야 합니다.
✅ 2) DB 세션 타임아웃 문제 해결
DB 세션이 일정 시간이 지나면 자동으로 종료되는 경우, JDBC 설정을 변경하여 해결할 수 있습니다.
Properties props = new Properties();
props.setProperty("oracle.jdbc.ReadTimeout", "60000"); // 60초 동안 응답 대기
props.setProperty("oracle.net.CONNECT_TIMEOUT", "10000"); // 10초 내 연결 시도
Connection conn = DriverManager.getConnection(DB_URL, props);
또한, DB 세션 타임아웃 설정을 확인하고 적절한 값으로 변경하는 것도 중요합니다.
SHOW PARAMETER sessions;
ALTER SYSTEM SET SESSIONS = 300;
위 명령어를 실행하여 현재 세션 수를 확인하고, 필요하다면 증가시킵니다.
✅ 3) 방화벽 설정 문제 해결
방화벽이 DB 연결을 차단하는 경우, DB 서버에서 방화벽 상태를 확인해야 합니다.
sudo iptables -L -n
만약 포트 1521이 차단되어 있다면, 방화벽 설정을 변경하여 열어주세요.
sudo iptables -A INPUT -p tcp --dport 1521 -j ACCEPT
AWS나 GCP와 같은 클라우드 환경에서는 보안 그룹(Security Group) 설정도 확인해야 합니다.
✅ 4) 커넥션 풀 설정 오류 해결
Tomcat을 사용하여 DB 커넥션을 관리하는 경우, server.xml
또는 context.xml
에서 커넥션 풀 설정을 최적화해야 합니다.
<Resource name="jdbc/irerp"
auth="Container"
type="javax.sql.DataSource"
driverClassName="oracle.jdbc.OracleDriver"
url="jdbc:oracle:thin:@//DB_SERVER:1521/SERVICE_NAME"
username="db_user"
password="db_password"
maxTotal="100"
maxIdle="30"
minIdle="10"
maxWaitMillis="10000"/>
여기서 maxWaitMillis="10000"
을 설정하여 커넥션 요청이 너무 오래 걸리지 않도록 제한할 수 있습니다.
✅ 5) DB 서버 과부하 해결
DB 서버가 과부하 상태라면, 현재 실행 중인 세션과 프로세스를 확인하고 불필요한 세션을 종료해야 합니다.
SELECT sid, serial#, status, schemaname FROM v$session WHERE status = 'ACTIVE';
특정 세션을 종료하려면 아래 명령어를 실행합니다.
ALTER SYSTEM KILL SESSION 'sid,serial#';
또한, DB 서버의 리소스를 모니터링하고 필요하면 서버 성능을 개선하는 작업이 필요합니다.
3. 해결책 요약
원인 | 해결 방법 |
네트워크 문제 | ping , telnet 으로 연결 확인 및 방화벽 점검 |
DB 세션 타임아웃 | JDBC 설정 변경 및 세션 제한 조정 |
방화벽 문제 | iptables , 클라우드 보안 그룹 설정 확인 |
커넥션 풀 오류 | Tomcat 커넥션 풀 설정 최적화 |
DB 과부하 | v$session 조회 후 불필요한 세션 종료 |
이제 위 방법들을 하나씩 적용해보면, IO 오류: Got minus one from a read call
문제를 해결할 수 있을 것입니다! 🔥
마치며
이번 포스팅에서는 Java에서 Oracle DB 연결 시 발생하는 SQLRecoverableException 오류에 대해 알아보고, 주요 원인과 해결책을 상세히 설명했습니다.
이 오류는 단순한 연결 문제부터 커넥션 풀 설정, 방화벽 문제 등 다양한 원인이 있을 수 있기 때문에, 한 가지 해결법만 시도하지 말고 순차적으로 점검하는 것이 중요합니다.
비슷한 문제를 겪고 계신가요? 혹은 다른 오류가 발생했나요? 댓글로 남겨주시면 추가 해결책도 제공해 드리겠습니다! 🚀