2012-10-22 2 views
0

실행 두 개의 스레드가 있습니다, 하나는이 같은 JDBC를 통해 연결하고 무거운 쿼리를 실행하는 스레드 :실행 중 무거운 SQL의 취소 실행을 치료하는 방법은 무엇입니까?

Statement stmtData = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY); 
ResultSet rsData = stmtData.executeQuery("SELECT * from hugeTable"); 

를 두 번째는 첫 번째 언급 스레드를 시작 하나이며 물론이 취소 DBMS에 의한 질의 실행 중 사용자가 요청한 경우 오랜 시간이 걸릴 수도 있습니다.

첫 번째 스레드에서 Interrupted() 메서드를 호출하려고 시도했지만 첫 번째 스레드에서 InterruptedException이 발생하기를 바랬습니다.

쿼리 실행 취소 방법 ?

+0

달성하려는 실제 사례를 알려주시겠습니까? usecase를 바탕으로 나는 당신의 시나리오에 맞는 솔루션을 제안 할 수 있습니다. – Subba

+0

@Subba 제 실제 사용법은 PL-SQL Developer의 "Break"버튼과 같습니다. SQL은 백그라운드에서 실행되지만 사용자는 여전히 취소 할 수 있습니다. 문제는 stmtData.executeQuery() 메서드가 비동기 적이 아니므로 실행을 중단하는 방법을 모르겠다는 것입니다. 어떠한 제안? –

+1

[실행중인 JDBC 트랜잭션을 어떻게 중단 할 수 있습니까?] (http://stackoverflow.com/questions/295920/how-can-i-abort-a-running-jdbc-transaction) –

답변

0

jdbc 드라이버가 취소를 지원하면 java.sql.Statement.cancel() 메소드를 사용할 수 있습니다. 스레드는 InterruptedException을 catch 한 다음 실행중인 명령문에서 cancel()을 호출해야합니다.

+0

InterruptedException을 던집니다 스레드를 만드는 방법? 내가 thread.interrupt()를 호출 할 때; 명령문을 실행할 때 예외를 던지지 않습니다. –

+0

그래 고마워요 @ 제프, 작동하지만 InterruptedException을 던질 필요가 없었습니다. 취소 메소드가 SQLException 자체를 던졌습니다. –

0

이렇게하는 방법은 거의 없습니다. 연결 풀을 사용하고 DataSource가 이것을 수행하는 가장 일반적인 방법이라고 생각하지만이를 관리하기 위해 내 app-server를 사용하게합니다.

여전히 하드 코딩하려면 apache BasicDataSource 및를 사용할 수 있습니다. setMaxWait();

여전히 빠르고 더러운 작업을 수행하려는 경우 (권장되지 않는 메소드 이외에 권장되지 않음) threadQuery.Stop();

+0

사실 나는 setMaxWait()이 사실이 아니라고 생각합니다. 왜냐하면 사용자가 취소 버튼을 누르 자마자 쿼리 실행을 중단시키기를 원하기 때문입니다. –

관련 문제