개발자/개발 공부

[DB 에러] Got minus one from a read call

Torybory 2025. 3. 17. 07:30
반응형

Caused by: oracle.net.ns.NetException: Got minus one from a read call

 

org.springframework.transaction.CannotCreateTransactionException: Could not open JDBC Connection for transaction; nested exception is java.sql.SQLRecoverableException: IO 오류: Got minus one from a read call
13:13.339 ERROR j.e.e.EtcExceptionMessageWriter - etc : 처리중 오류가 발생하였습니다.

 

여느때와 다름없이 로컬 서버를 돌려서

개발 중이었는데 갑자기 이런 에러가 떴다.

대환장파티네 증말..


chatGPT 답변

오류 메시지를 분석해 보면, Spring 애플리케이션에서 데이터베이스 연결을 생성하는 과정에서 문제가 발생한 것으로 보입니다.
특히 java.sql.SQLRecoverableException: IO 오류: Got minus one from a read call 이 핵심 원인입니다.


🔍 원인 분석 및 해결 방법

반응형

1️⃣ 데이터베이스 연결 문제 (DB 서버 다운 또는 네트워크 문제)

  • 해당 오류는 DB 서버가 다운되었거나 네트워크 문제로 인해 연결이 끊길 때 자주 발생합니다.
  • 확인 방법
    • DB 서버가 실행 중인지 확인 (Oracle, MySQL 등 사용하는 DB 종류에 따라 다름)
      ps -ef | grep oracle  # Oracle DB 확인
      systemctl status mysql  # MySQL DB 확인
      
    • 서버에 직접 ping 또는 telnet 실행하여 네트워크 연결 확인
      ping <DB_HOST>
      telnet <DB_HOST> <DB_PORT>
      
    • DB에 수동으로 접속 가능한지 확인 (sqlplus 또는 mysql 사용)
      sqlplus username/password@host:port/service_name
      
  • 해결 방법
    • DB가 다운되어 있다면 서버를 다시 시작
    • 방화벽 또는 보안 설정 확인 (DB 포트 1521 등 허용 여부 체크)
    • VPN 또는 프록시 문제 여부 확인

2️⃣ JDBC 연결 풀 (Connection Pool) 문제

  • 설정된 최대 연결 수를 초과하거나 DB 연결이 끊겼는데 Connection Pool이 이를 감지하지 못하는 경우 발생할 수 있습니다.
  • 확인 방법
    • application.properties 또는 application.yml에서 데이터베이스 관련 설정 확인
    • HikariCP, Tomcat JDBC Pool, C3P0 등 사용 중인 커넥션 풀을 확인
  • 해결 방법
    • HikariCP 사용 시, 다음 설정을 추가하여 커넥션이 정상적으로 재사용되는지 확인
      spring.datasource.hikari.maximum-pool-size=10
      spring.datasource.hikari.minimum-idle=5
      spring.datasource.hikari.connection-timeout=30000
      spring.datasource.hikari.idle-timeout=600000
      spring.datasource.hikari.max-lifetime=1800000
      
    • MySQL 사용 시
      spring.datasource.url=jdbc:mysql://<DB_HOST>:<DB_PORT>/<DB_NAME>?autoReconnect=true&useSSL=false
      
    • Oracle 사용 시
      spring.datasource.url=jdbc:oracle:thin:@<DB_HOST>:<DB_PORT>:<SID>
      

3️⃣ 트랜잭션 문제 (org.springframework.transaction.CannotCreateTransactionException)

  • Spring에서 트랜잭션을 시작할 때 DB 연결을 확보하지 못해서 발생한 오류
  • 가능한 원인
    • DB 연결 풀(Connection Pool) 고갈
    • 데드락(Deadlock) 발생
    • 트랜잭션이 너무 길게 유지됨
  • 해결 방법
    • 트랜잭션을 너무 길게 유지하지 않도록 코드 수정
    • 적절한 @Transactional 사용 (propagation 및 timeout 옵션 설정)
    • JDBC 커넥션을 적절히 반환하는지 코드 점검
    • spring.datasource.hikari.leak-detection-threshold=2000 설정 추가하여 누수 감지

4️⃣ JDBC 드라이버 문제

  • JDBC 드라이버가 오래되었거나, 애플리케이션과 호환되지 않는 경우 발생 가능
  • 확인 방법
    • 현재 사용 중인 JDBC 드라이버 버전 확인
    • 최신 버전의 JDBC 드라이버로 업데이트
    • pom.xml (Maven) 또는 build.gradle (Gradle)에서 드라이버 버전 확인 후 변경
      <!-- Oracle JDBC 드라이버 (pom.xml) -->
      <dependency>
          <groupId>com.oracle.database.jdbc</groupId>
          <artifactId>ojdbc8</artifactId>
          <version>21.5.0.0</version>
      </dependency>
      

728x90

최종 점검 체크리스트

DB 서버가 정상적으로 실행 중인지 확인
네트워크 연결 확인 (ping, telnet, 방화벽 설정 확인)
JDBC URL 및 Connection Pool 설정 확인
Spring 트랜잭션 설정 점검 (@Transactional, timeout 설정)
JDBC 드라이버 버전 업데이트

이 방법을 하나씩 점검해 보면 문제를 해결할 수 있을 가능성이 높습니다! 🚀


데이터베이스 커넥션 문제??

나는 챗지피티가 얘기한 원인이 문제가 아니었고

구글에 검색해보니 데이터베이스 커넥션 풀이 가득차서 문제가 난다,

데이터베이스 리스너 문제다,  같은 답변이 많았다.

 

ORA-12537: TNS:연결이 종료되었습니다

실제 데이터베이스 툴인 디비버에 들어가서 확인해보니

DB 연결이 다 끊어져 있었고, 연결시도하면 같은 에러가 나는 상황.

토드도 마찬가지임.

그래서 이건 이클립스 문제가 아닌 DB문제임을 확신.

 

Toad 사용중이었는데 이전에 작업하던 것 커밋 다 했나? 싶어서

일단 커밋은 다 했던걸로 기억하지만 다시 한 번 더 커밋 누름.

그리고 혹시 몰라서 Toad 다 끔.

그래도 안됨 -> 디비버도 다 끔 -> 커넥션 풀 문제라고 해서.. 일단 계속 어떻게 풀어야 하나 구글링...

그러던 차에 다시 토드에 들어가서 DB 연결 시도해봤는데 갑자기 됨.. (???) 

그래서 이클립스도 재기동 해봄 -> 로컬 사이트 오픈 -> 잘 됨...

 

뭔지는 모르겠지만 다행히 해결..

일시적으로 접근중이던 커넥션이 너무 많아서 그랬던 것 같음.

그래서 새 접근을 계속 막으며 에러를 뱉은 것 같다.


 

이상... Got minus one from a read call 해결 기록이었습니다 💕👍