2010-08-04 3 views
5

아주 먼 곳에있는 데이터베이스에서 작동하는 준비된 문을 사용하려고하는데이 데이터베이스에 액세스하는 데 사용되는 네트워크 연결과 관련하여 상당한 지연과 불안정이 있습니다. 최대 1 분의 중단 시간이 일반적입니다. 문제는 이런 경우에 내 프로그램이 준비된 명령문을 실행하려고하면 전체 스레드가 무한 대기 상태가됩니다. 시간이 초과되지 않고 데이터베이스에서 응답을 기다리는 채로 있습니다.준비된 문에 시간 제한 사용

setQueryTimeout()을 사용하여 명시 적으로 실행 시간 초과를 시도했지만 네트워크가 실패 할 경우 제대로 작동하지 않는이 방법에 문제가있는 것 같습니다.

다른 대안이 있나요?

+0

간단한 제한 시간 초과 사용으로 보이기 때문에이 문제를 해결할 수있는 또 다른 방법이 있습니까? 또한 트랜잭션 관리자를 사용하지 않으려 고합니다 – angryInsomniac

답변

3

제 생각에는 네트워크 자체가 실패 할 경우 그러한 대안이 없습니다.

정확한 세부 사항은 Prepared Statement의 실행을 중지하기 위해 JDBC 드라이버가 Out of Band 신호 (Oracle JDBC 드라이버의 경우 적어도)를 데이터베이스로 보내도록 지시하는 것입니다. 이 부분은 드라이버와 데이터베이스에 내장 된 지원에 따라 중요합니다. 다음은이 '취소'작업의 실행을 예약하기 위해 데이터베이스까지입니다. 롤백해야하거나 다른 트랜잭션을 실행해야하는 경우에는 시간이 걸릴 수 있습니다.

구현의 첫 번째 부분을 감안할 때 타임 아웃을 "완전하게"구현하지는 않을 것입니다 기능을 설정할 수 있습니다. 여기에 트랜잭션 관리자 (아마도 JTA)의 사용을 조사하고 싶을 지 모르지만, 기발한 예외 (발견 적 예외를 생각하십시오)와 또 다른 세트가 있는지 확실하지 않습니다.

부록

다른 스레드의 실행을 모니터링하고 '갇혀'스레드가 좋은 생각이 될 수도 죽이는 스레드 모니터를 사용. This SO question은 그러한 활동을 피해야하는 이유에 대한 답변을 제공합니다. 이것은 tactic chosen by WebLogic Server입니다.

+0

이 문제를 해결할 수있는 대체 방법이 있습니까? , 난 정말 트랜잭션 관리자를 사용하는 경향이 있기 때문에 그것은 간단한 시간 초과에 대한 잔인한 것 같습니다. – angryInsomniac

+0

데이터베이스에서 허용하는 경우 쿼리를 실행할 수있는 시간을 제한합니다. Oracle DB는 MAX_EST_EXEC_TIME 값으로 지정된 제한을 초과하는 쿼리의 값을 지정하는 리소스 계획을 사용하여이를 허용합니다. 오라클 세션이 종료됩니다. –