✅ DB세션이란
DB세션은 커넥션 풀에서 개별 커넥션이 유지하는 세션정보를 담은 커넥션 그 자체입니다.
즉, 커넥션 하나 = DB 세션 하나 🎯 DB내부 사용자의 상태, 작업공간 ( 아직 커밋되지 않은 변경 내용(트랜잭션)을 잠시 보관하고 실험하는 공간)
- 애플리케이션이 DB에 접속하면, DB는 그 사용자에게 세션(Session) 이라는 공간을 만들어 줍니다.
- 이 세션 안에서는 다음과 같은 것들을 따로 관리해요:
세션 안에서 관리되는 정보설명
트랜잭션 상태 | BEGIN, COMMIT, ROLLBACK 여부 |
커서 정보 | SELECT 결과 위치 (페이징 같은 기능에 사용) |
변수/임시 테이블 | Oracle의 GLOBAL TEMPORARY TABLE 등 |
언두(UNDO) 영역 | 아직 커밋되지 않은 변경 정보 저장 |
락 정보 | 어떤 행이 락 걸렸는지, 누가 점유 중인지 |
🔁 커밋 전에는 "나만 보는 가상 공간"
예를 들어:
BEGIN;
UPDATE accounts SET balance = balance - 10000 WHERE id = 1;
-- 이 시점에서 다른 트랜잭션은 balance가 바뀌었는지 모름!
-- → 내 세션에서만 반영됨 (언두/레드 로그와 버퍼에 있음)
COMMIT;
- 이 UPDATE는 실제로 DB에 저장된 게 아니라, → 세션 내 메모리 공간에 “임시로 반영” 되어 있어요.
- COMMIT 하기 전까지는 다른 세션에서는 절대 안 보임 → MVCC (다중 버전 동시성 제어) 방식 때문입니다.
📦 정말 작업공간처럼 쓰이는 대표적인 예
✅ Oracle의 임시 테이블 (Global Temporary Table)
CREATE GLOBAL TEMPORARY TABLE temp_data (
id NUMBER,
value VARCHAR2(100)
) ON COMMIT DELETE ROWS;
- 이 테이블은 세션마다 별도 공간을 가짐
- 다른 세션에는 안 보임 = 진짜 "나만의 공간"
✅ 정리하면
DB 세션은 사용자 1명이 작업하는 동안 DB가 따로 마련해주는 “작업 공간”이고,
그 안에서 트랜잭션이 커밋되기 전까지는 모두 “내 눈에만 보이는 결과”를 다룹니다.
🧠 참고로 이 덕분에 가능한 기술이 많아요:
- ROLLBACK → 원래대로 복구
- 비동기 SELECT → 다른 트랜잭션의 진행과 충돌 없음
- 트랜잭션 충돌/충돌 방지 → 락 & 격리 수준
✅ 왜 DB 세션 모니터링이 중요한가?
DB의 성능 문제는 단순히 쿼리 성능에서만 오는 게 아니라,
오래 열린 세션, 락을 잡고 있는 세션, 갑작스러운 커넥션 폭증 등 다양한 원인이 복합적으로 작용합니다.
특히 Oracle 환경에서는 세션 추적 → 병목 식별 → 알람 설정을 통한 지속적인 관찰과 대응이 매우 중요합니다.
🔍 Oracle 주요 뷰 소개
1. v$session: 현재 열려 있는 모든 세션 정보
- 로그인한 사용자, 클라이언트 IP, 상태, 대기 이벤트 등 확인 가능
SELECT sid, serial#, username, status, osuser, machine, event
FROM v$session
WHERE username IS NOT NULL;
2. v$process: 실제 Oracle 백엔드 프로세스 정보
- 서버 프로세스(PID), 메모리 사용량 등 리소스 기반 문제 추적 시 사용
SELECT p.spid, s.sid, s.serial#, s.username, s.program
FROM v$session s
JOIN v$process p ON s.paddr = p.addr
WHERE s.username IS NOT NULL;
3. v$sql: 실행 중인 SQL 정보 (쿼리 식별)
- 어떤 SQL이 수행 중인지, 비용이 얼마나 드는지 파악 가능
SELECT sid, serial#, username, status, osuser, machine, event
FROM v$session
WHERE username IS NOT NULL;
SELECT sql_id, sql_text, executions, elapsed_time/1000000 elapsed_sec
FROM v$sql
WHERE elapsed_time > 10000000
ORDER BY elapsed_sec DESC;
🔎 Java 애플리케이션에서 DB 세션 추적하기
Java 애플리케이션에서 Oracle에 연결된 세션을 추적하려면 program, module, action 값을 활용하는 것이 효과적입니다.
✅ Spring + Oracle JDBC 설정 예 : Spring Boot에서 로그로 세션 트래킹.
Connection conn = dataSource.getConnection();
conn.unwrap(OracleConnection.class)
.setClientInfo("OCSID.MODULE", "MyServiceModule");
- Oracle SQL에서 MODULE 컬럼을 통해 어떤 서비스에서 접속했는지 확인 가능
SELECT sid, username, module, status FROM v$session WHERE module = 'MyServiceModule';
⚠️ 문제 세션 찾기 – 이런 것들을 모니터링 하자
유형 | 탐지 기준 | SQL 예시 |
오래 열린 세션 | 상태가 INACTIVE이고 시간 길게 유지 | 1 |
락을 잡고 있는 세션 | v$lock, v$session 조인 | 2 |
대기 중인 세션 | 특정 이벤트에서 대기 상태 지속 | 3 |
-- 1. 오래 열린 세션
SELECT sid, username, status, last_call_et/60 AS idle_min
FROM v$session
WHERE status = 'INACTIVE' AND last_call_et > 600;
-- 2. 락을 잡고 있는 세션
SELECT s.sid, s.serial#, s.username, l.type, l.id1, l.id2
FROM v$session s
JOIN v$lock l ON s.sid = l.sid
WHERE l.block = 1;
-- 3. 대기 중인 세션
SELECT sid, event, wait_class, seconds_in_wait
FROM v$session
WHERE state = 'WAITING' AND seconds_in_wait > 5;
📈 자동 모니터링 알람 구성
✅ 1. SQL Developer로 모니터링
- SQL Developer > Reports > Sessions
- 특정 조건에 따라 세션 색상 구분
- 세션 종료 명령 제공: ALTER SYSTEM KILL SESSION 'sid,serial#';
✅ 2. Grafana + Oracle Exporter (Prometheus)
- Oracle용 Exporter 설치 후 메트릭 수집
- 주요 지표:
- oracle_sessions (전체 세션 수)
- oracle_sessions_active (ACTIVE 상태 세션)
- oracle_sessions_waiting (WAIT 중인 세션)
- 임계값 설정 → Slack, Email 알람 연동 가능
✅ 3. Spring Boot + Actuator + Micrometer 연동
- 커넥션 풀 상태도 세션과 간접적으로 연결됨
management:
endpoints:
web:
exposure:
include: health, metrics
- /actuator/metrics/hikaricp.connections.active 활용 가능
🧷 정리 – 실무 적용 팁
- v$session, v$process, v$sql 조합은 가장 강력한 트러블슈팅 도구
- Java 애플리케이션은 세션 추적값(MODULE 등) 세팅 필수
- “잠재적 문제 세션”은 비활성 세션, 락 세션, 대기 세션
- SQL Developer, Grafana, Actuator 등 다양한 도구로 자동화 가능
👉 다음 글에서는 트랜잭션 격리 수준과 세션의 관계를 실무 예제 중심으로 살펴보겠습니다.
'🛢️ Database' 카테고리의 다른 글
📘 읽기전용 DB분산구조는 왜필요한가(Read Replication) – Primary / Replica 구조 | 읽기 부하 분산 | 실시간 복제 이슈 (0) | 2025.04.07 |
---|---|
🔐 트랜잭션 격리 수준과 세션 관계 – 성능과 일관성의 줄다리기 | READ COMMITTED, SERIALIZABLE | 트랜잭션과 세션/커넥션의 생명 주기 관계 (0) | 2025.04.06 |
🔧 커넥션 풀 튜닝 전략 – 성능 병목을 잡는 핵심 포인트 (0) | 2025.04.06 |
데이터베이스_index (0) | 2025.04.06 |
[DB] HikariCP 커넥션 풀 왜쓰는거야? | 작동 흐름 | 커넥션 풀 없는 구조 vs 있는 구조 비교 | 세션모니터링 (0) | 2025.04.06 |
댓글