2016-09-13 2 views
1

시간이 지나면 내부 서버 오류가 발생하는 응용 프로그램이 있습니다. 요청한 사람들 중 일부는 응용 프로그램의 연결 유출로 인해 발생할 수 있다고 말했습니다. 검색을 시작한 후 연결 유출을 시뮬레이트하기 위해이 쿼리를 발견했습니다.Java 응용 프로그램에서 연결 누출 찾기

select LAST_CALL_ET, SQL_TEXT, username, machine, to_char(logon_time, 'ddMon hh24:mi') as login, SQL_HASH_VALUE, PREV_HASH_VALUE, status from v$session, v$sql where username='USERNAME' and HASH_VALUE = PREV_HASH_VALUE order by last_call_et desc;.

이 쿼리로 내 응용 프로그램을 모니터링하고이 결과에 표시된 쿼리에 대해 모든 유출 된 연결을 닫았습니다. 하지만 이제는 더 적은 비활성 세션에 대해서도 동일한 오류가 발생하기 시작합니다. 활성 세션/연결 누출에서 정확한 쿼리를 사용하고 있습니까? 누군가 =이 쿼리에 PREV_HASH_VALUE 잘못,하지만 이러한 열 모르는 (많이하지 DB 지식.) 당신이 누출 당신은 같은 프로파일을 사용할 수를 찾을 필요가

+1

'Statement','PreparedStatement','ResultSet' 및'Connection' 객체를 모두 닫고 있습니까? – copeg

+0

@copeg 예 선생님, 현재 결과에 나오는 모든 검색어를 검색하고 모든 결과를 닫습니다. 하지만 때로는 연결 및 다른 객체가 닫힌 경우에도 다른 쿼리를 차단하는 비활성 세션 결과에서 동일한 쿼리를 볼 수 있습니다. – aatif

+0

웹 응용 프로그램입니까, 독립 실행 형 응용 프로그램입니까? 어떤 연결 풀 라이브러리가 사용합니까? –

답변

2

감사합니다 조건 HASH_VALUE 나에게 말했다 소켓/jdbc 유출을 추적 할 수있는 yourkit 또는 jprofiler

당신이 연결을 열 장소를 찾을 수있다 누수를 해결하고 사용하려고 - - 자원 당신

try (Connection conection = DriverManager.getConnection(url); 
    PreparedStatement statement = createPreparedStatement(conection); 
    ResultSet resultSet = statement.executeQuery()) { 
    // process the resultSet here, all resources will be cleaned up 
} 
+0

찾은 모든 연결을 닫고 있지만 여전히 일부 쿼리는 다른 것을 차단합니다. "try-with-resources"를 시도하고 문제가 해결되는지 확인합니다. 감사합니다. – aatif

0

대부분의 연결 풀은 연결 누수를 기록 할 수있는 구성이 모든 close() 물건을 할 것입니다. DBCP에 익숙하지 않지만 documentationlogAbandoned 속성이 연결 누수를 기록한다는 것을 나타냅니다. logAbandoned를 true로 설정하면 DCBP는 풀 시간 초과 속성 이후에 스택 추적을 기록해야합니다. 스택 추적에는 누출 된 연결이 열린 위치가 포함됩니다.

관련 문제