2009-09-07 5 views
2

Oracle 데이터베이스 쿼리에 대한 연결/쿼리 시간 초과를 지정할 수 있습니까? Oracle 측 또는 Oracle JDBC 드라이버 (10.2.0.4)에서? 오라클이 쿼리 실행을 끝낼 때까지 기다리는 대신 2 분이 지나면 Java 클라이언트가 오류를 반환합니다.Oracle 연결/쿼리 시간 초과

답변

4

트랜잭션 컨텍스트에서 쿼리를 실행하는 경우 JTA 트랜잭션 모니터의 트랜잭션 시간 초과 값이 쿼리 제한 시간의 결정 요소가됩니다. 이 구성은 응용 프로그램 서버마다 다릅니다.

개별 쿼리 수준 (JTA 트랜잭션 모니터가없는 경우)에서는 setQueryTimeout 메서드를 사용하여 Statement/PreparedStatement/CallableStatement 개체 실행시 제한 시간을 설정할 수 있습니다. 그것은 (이어야 J2SE 클라이언트에서) 작동하지만

업데이트

setQueryTimeout가 의존 할 수 없습니다. Oracle 드라이버는 JDBC 드라이버를 통해 Oracle 데이터베이스 서버로 전체 라운드 트립을 수행합니다. 그런 다음 데이터베이스가 쿼리 실행을 중단합니다. 시간이 중요한 응용 프로그램에 의존하지 마십시오.

+1

JTA 시간 초과 문제는 실행중인 쿼리에 영향을주지 않으므로 문제가 있습니다. 그리고 실제로 실행중인 WebLogic 서버는 장시간 실행중인 연결을 종료하려고 시도하고 다른 스레드를 생성하지만 Oracle JDBC 드라이버에서 Java 잠금을 사용하여 두 스레드가 대기하도록합니다. WebLogic은 더 많은 킬러 쓰레드를 만들려고 시도하고 결과적으로 쓰레드가 부족해 지므로 문제는 더욱 심각해집니다. –

+0

setQueryTimeout에 대한 요점은 매우 intresting 것으로 보인다 나는 전에 actuallly 생각하지 않았습니다 :). setQueryTimeout이 질의를 취소하는 데 시간이 좀 걸리는지 여부는 신경 쓰지 않습니다. 주요 결과는 다음과 같습니다. :) 나는 시험 결과를 다시 얻을 것이다. –

+1

WLS에서 setQueryTimeout()이 작동하지 않는 이유는 JTA 때문에 더 그렇습니다. 나는 드라이버가 트랜잭션 컨텍스트에서 setQueryTimeout 호출에 응답 할 것이라고 생각하지 않지만 올바르지 않을 수 있습니다. –

2

오라클 프로파일을 살펴보십시오. 이렇게하면 데이터베이스 수준에서 몇 가지 제한을 지정할 수 있습니다. 그 중 하나는 쿼리 당 최대 CPU 시간입니다.

정기적으로 2 분 이상 쿼리를 실행하는 경우 먼저 쿼리를 조정해야 할 수 있습니다.

+0

Oracle 프로필은 사용자에 대한 모든 쿼리에 영향을줍니다. 영업 담당자는 취소해야하는 특정 쿼리에만 관심이있을 수 있습니다. –

+1

그러나 이것은 무차별 대용 솔루션으로 작용할 것입니다 :-) –

+0

setQueryTimeout이 작동하지 않으면 오라클 프로파일이 다음 단계가됩니다. :) –