트러블슈팅

[트러블슈팅] DB 세션이란? 롱 아이들 세션이 쌓이면 생기는 진짜 문제

리신 2025. 4. 21. 00:00
반응형

 

 

 

원래는 인터페이스로 통신해 해당 기능을 실행하던 구조였는데
직접 시스템 자체에서 해당 기능을 처리하라는 요청이 들어왔다.

 

급하게 대응하기 위해 DB LINK를 신청해서 다른 DB에 INSERT하는 방식으로 로직을 변경했고
단순한 작업이라 금방 끝냈다고 생각했다.

 

그런데 바로 다음날 DBA팀에서 연락이 왔다.

해당 DB에 세션이 갑자기 급증했는데, 혹시 무슨 작업하셨어요?

 

확인해보니, DB LINK를 통해 연결된 세션이 자동으로 닫히지 않아
INACTIVE 상태로 계속 남아 있었던 것...

 

이 일을 계기로, DB 세션과 롱 아이들 세션 이슈의 심각성을 처음 알게 되었고
정리 차원에서 이 글을 작성하게 되었다.

 

 


DB 세션이란?

DB 세션은 클라이언트(자바 애플리케이션 등)가
DB에 접속할 때 생성되는 하나의 연결 통로


해당 세션을 통해 SQL 쿼리를 날리고 결과를 받아오며
작업이 끝나면 close() 등을 통해 명시적으로 종료해줘야 함

 

 


롱 아이들 세션(Long Idle Session)이란?

세션이 열려 있지만 아무 작업도 하지 않고 오랫동안 남아있는 상태를 말함.


보통 INACTIVE, IDLE 상태라고 표현되며
이 세션들도 여전히 DB 자원을 점유하고 있기 때문에 문제가 됨

 


 

DB LINK를 썼을 때 왜 이런 문제가 생겼을까?

DB LINK는 하나의 DB에서 다른 DB로 직접 접근할 수 있는 기능


INSERT 쿼리 한 줄만 날리면 끝나는 것 같지만
실제로는 다음과 같은 이유로 세션이 정리되지 않고 쌓일 수 있음

  • 쿼리 실행 후 커밋/롤백을 명시적으로 하지 않음
  • 자바 코드에서 DB LINK로 연결된 커넥션을 직접 종료할 수 없음
  • 외부 DB에서 rollback을 기다리는 상태일 수 있음
  • 기능이 반복적으로 호출되면서 세션이 계속 누적됨

 


 

어떻게 해결할 수 있을까?

방법 설명
트랜잭션 명확히 처리 COMMIT 또는 ROLLBACK을 명시적으로 해줄 것
DB LINK 사용 최소화 읽기 전용 쿼리는 괜찮지만 쓰기(INSERT/UPDATE)는 피할 것
JNDI 방식으로 전환 자바 애플리케이션에서 직접 DB커넥션을 관리할 수 있어 세션 회수가 쉬움
커넥션 풀 설정 튜닝 removeAbandoned=true, removeAbandonedTimeout 설정 등을 통해 미사용 커넥션 회수 가능

 

✅ 내가 실제로 해결한 방법

필자는 DB LINK 방식에서 발생한 세션 누적 문제를 해결하기 위해
DB 연결 방식을 JNDI로 전환했다.


이렇게 하면 애플리케이션 레벨에서 커넥션을 직접 제어할 수 있고
세션이 자동으로 관리되어 누수가 발생하지 않는다.

 

다만, 직접 해당 DB에 INSERT를 수행해야 했고
해당 DB는 사양이 낮은 편이어서 TPS(Transactions Per Second)를 너무 높이지 않도록 주의가 필요했다.

 

그래서 JNDI 설정 시
커넥션 풀의 maxActive 값도 의도적으로 낮게 조정
DB에 무리가 가지 않도록 설정했다.

 

JNDI 설명 참고

https://dev-cini.tistory.com/90

 

 


결론

세션은 눈에 보이지 않지만
쌓이면 시스템에 큰 문제를 유발할 수 있는 중요한 자원임

 

DB LINK는 설정이 간단하다는 장점이 있지만
트랜잭션 관리와 세션 종료가 불확실해 세션 누적 문제가 자주 발생함

 

가능하다면
JNDI 기반 커넥션 풀 방식으로 DB를 연결하고
트랜잭션을 명확하게 종료하는 습관을 들이는 것이 좋음

 

 

 

반응형