2013-02-28 1 views
0

나는 무거운 데이터베이스 연산을 수행하는 자바 쓰레드를 가지고있다. 나는이 자바 스레드를 죽일 API를 코딩하고있다. executor 프레임 워크를 사용하고 있습니다. 그래서 미래가되면 future.cancel()을 호출 한 다음 스레드 인터럽트를 확인합니다.자바 : DB 작업을 수행하는 스레드 죽이기

위의 로직은 스레드가 DB 조작을 수행하는 시나리오를 제외하고는 잘 작동합니다. 스레드를 죽이는 것은 DBA 간섭을 의미하는 DB 연결 종료와 관련됩니다.

내 목표는 지원 팀의 개입이 필요없는 API를 만드는 것입니다.

이 문제를 해결하는 방법에 대한 아이디어는 매우 유용 할 것입니다.

CODE :

private void killBatches1() { 
    if (killBatchRunning.compareAndSet(false, true)) { 
    try{ 
     Iterator<Future<?>> futureIterator = futuresForBatch.iterator(); 
     while (futureIterator.hasNext()) { 
      Future<?> future = futureIterator.next(); 
      if (future.cancel(true)) 
       ; 
      futureIterator.remove(); 
     } 
     }finally{ 
     killBatchRunning.set(false); 
     } 
    } 
+0

코드는 어디에 있습니까? – TheWhiteRabbit

+0

일부 코드는 매우 유용 할 것입니다. –

+1

코드를 추가했습니다. 질문은 논리에 더 많은 것이었고 그래서 나는 그것을 붙여 넣지 않았고 사람들은 단지 downvotes로 두드렸다 !! – Lokesh

답변

1

그렇게하지 마십시오! 스레드가 DB 작업을 시작한 후이를 종료하면 데이터베이스에 문제가 발생할 수 있습니다. 당신의 쓰레드가 데이터베이스를 업데이트하고 당신이 그것을 죽인다고 가정하십시오. 거래가 끝났습니까? 변경 사항이 커밋 되었습니까? 스레드를 죽이면 롤백을해야합니다. "무거운 데이터베이스 작업"이라고 말하면서 매우 비쌉니다! (나는 많은 시간 동안 데이터베이스 롤백을 경험했다. 그리고 나는 그들을 증오하게되었다).

기술적으로 OS에 액세스하여 DB 연결 프로세스를 검색하여 죽일 수는 있지만 위에서 말했듯이 이것은 나쁜 습관 일뿐만 아니라 위험합니다.

제 조언은 큰 데이터베이스 작업을 작은 덩어리로 처리 할 수있는 방법을 찾는 것이므로 더 신속하게 대응하고 제어 할 수 있습니다.

+0

귀하의 요지에 동의합니다. 우리는 롤백하지 않는 디자인을 가지고 있으며 이전에 삽입 한 모든 레코드를 더 이상 사용하지 않습니다. 따라서 일단 이전에 Java 스레드를 다시 시작한 후에는 db 연결을 종료해야합니다. – Lokesh

+0

그렇다면 왜 DB 스레드를 죽여야합니까? – vainolo

+0

시나리오는 다음과 같습니다 : 우리는 2 개의 병목을 갖기 위해 메인 메모리로 가져온 백만 건의 레코드를 처리합니다. 우선 sql이 어떤 이유 때문에 느리게 실행되는 경우 또는 두 번째 문제는 잘못된 데이터로 인해 현재의 calcultions를 중지하려는 경우입니다. [전체 계산이 완료 될 때까지 기다리기를 원하지 않습니다.] 두 경우 모두 스레드 기능을 중지해야하지만 첫 번째 시나리오에서는 DB 작업이 문제가됩니다. – Lokesh

0

이론적으로 thread interrupt()를 호출 할 수 있습니다. JDBC 드라이버가 인터럽트를 지원하면 적절한 예외가 호출되어 코드에서 발견되어야합니다. 그렇지 않으면 연결을 닫으려고 할 수 있습니다. 그것도 예외를 throw해야합니다. 어쨌든 JDBC 드라이버의 사양에서이 질문을 연구하십시오.

+0

나는 이것이 올바른 접근이라고 생각하지 않는다. – Lokesh

관련 문제