티스토리 뷰

잘되던 소스에서 어느 날부터 "java.sql.SQLException: 소켓에서 읽을 데이터가 없습니다." 오류가 발생했습니다. 락이 걸려 있는 세션을 찾아봐도 문제가 없었고, 같은 쿼리의 특정 row 에만 문제가 있는 것으로 보였습니다. 혹시 저와 같은 증상을 겪고 있다면 아래 쿼리를 이용하여 세션뿐 아니라 트랜잭션이 살아있는지 확인해야 합니다.

 

1. 세션 확인

SELECT
    SUBSTR (TO_CHAR (LAST_CALL_ET), 1, 6) "경과시간(초)" 
    , A.USERNAME
    , MACHINE
    , A.SQL_ID
    , B.SQL_TEXT SQLTEXT
    , 'ALTER SYSTEM KILL SESSION ' || ''''  || A.SID || ', ' || A.SERIAL# || ''';' AS QUERY 
    , A.LOGON_TIME
FROM 
	V$SESSION A, V$SQLTEXT B, V$PROCESS C
WHERE 
	A.USERNAME NOT IN ('SYSTEM', 'SYS')
    AND A.TYPE != 'BACKGROUND'
    AND A.STATUS = 'ACTIVE'
    AND A.SQL_ADDRESS = B.ADDRESS(+)
    AND A.SQL_HASH_VALUE = B.HASH_VALUE(+)
	AND A.PADDR=C.ADDR   
ORDER BY 
    A.LAST_CALL_ET DESC,
    A.SID,
    A.SERIAL#,
    B.ADDRESS,
    B.HASH_VALUE,
    B.PIECE;
  • 경과시간이 상당시간 지난 후 라면 SYSTEM KILL 명령어를 이용하여 세션을 종료시킵니다.

 

2. 트랜잭션 확인

SELECT 
	S.SID
    , S.SERIAL#
    , S.USERNAME
    , T.STATUS
    , T.START_TIME
FROM 
	V$SESSION S JOIN V$TRANSACTION T 
    ON S.SADDR = T.SES_ADDR
WHERE 
	T.STATUS = 'ACTIVE';
  • 세션이 종료되었더라도 트랜잭션은 남아있을 수 있습니다. 위 명령어를 통해 살아있는 트랜잭션을 종료하면 오류가 해결 될 수 있습니다.

 

감사합니다.

최근에 올라온 글
Total
Today
Yesterday