2011-03-13 2 views
2

Java의 TaskExecutor를 사용하여 비동기 데이터베이스 쓰기를 시작한다고 생각합니다. 이해할 수 있듯이 스레드는 무료로 제공되지 않지만 5-10이라는 고정 된 스레드 풀 크기를 사용한다고 가정 할 때 이것이 나쁜 생각입니까?자바 : 비동기 데이터베이스 쓰기를위한 TaskExecutor?

우리 응용 프로그램은 버퍼를 사용하여 매우 큰 파일을 읽고 일부 데이터 조작을 수행 한 후이 정보를 데이터베이스로 플러시합니다. 비동기 쓰기를 사용하면 파일 작업을 계속할 수 있으므로 이상적입니다. 내가 뭘 놓치고 있니? 모든 응용 프로그램에서 비동기 쓰기를 사용하는 이유는 무엇입니까?

답변

2

왜 모든 응용 프로그램이 비동기 쓰기를 사용하지 않습니까?

쓰기 오류를 동기식으로 처리해야하는 경우가 종종 있습니다.

+0

비동기 적으로 데이터베이스에 데이터를 쓸 때 쓰기 오류를 처리하는 좋은 방법은 무엇입니까? 또한 런타임에 캐시에 쓰고 비동기 적으로 데이터베이스에 데이터를 저장합니다. 내가 생각한 접근법은 ThreadPoolExecutor에 대기중인 작업을 "어떻게 든"유지하는 것이 었습니다. 이게 말이 돼? 더 좋고/더 쉬운 방법이 있습니까? – kapad

2

스레드 풀이 필요한지 확실하지 않습니다. 모든 쓰기 및 오류 처리를 수행하는 전용 databaseWriter 스레드를 사용하는 것이 좋습니다. 뭔가 같은 :

public class AsyncDatabaseWriter implements Runnable { 
    private LinkedBlockingQueue<Data> queue = .... 
    private volatile boolean terminate = false; 

    public void run() { 
     while(!terminate) { 
      Data data = queue.take(); 
      // write to database 
     } 
    } 
    public void ScheduleWrite(Data data) { 
     queue.add(data); 
    } 
} 

개인적으로 멋진 시간이 오래 걸릴 수 있습니다 작업을 스레딩에 대한 Proxy을 사용하는 스타일. 나는이 방법이 어떤 식 으로든 executor를 사용하는 것보다 낫다는 말은 아니다. 그냥 대안으로 추가하는 것이다.

+0

프록시를 사용할 때 큐에 지속성을 추가하는 좋은 방법이 있습니까? – kapad

-2

왜 모든 응용 프로그램이 비동기 쓰기를 사용하지 않습니까? 모든 응용 프로그램이 다른 일을하기 때문에 erm.

일부 응용 프로그램도 데이터베이스 OMG !!!!!!!!!를 사용하지 않는다고 믿을 수 있습니까?

심각하게 생각하면, 실패 전략이 무엇인지 말하지 않기 때문에 - 합리적 일 수 있다고 생각됩니다. 쓰기가 실패하면 어떻게됩니까? 또는 db가 어떻게 든 사라집니다.

sybase와 같은 일부 데이터베이스는 실제로 하나의 테이블에 여러 개의 작성자가있는 것을 좋아하지 않습니다. 모든 작성자가 서로를 차단했습니다. 실제로 많은 차이를 내지 않을 것입니다 ...

2

아이디어는 전혀 나쁘지 않습니다. 사실 60000 개의 항목과 같은 5 가지 카테고리가있는 온라인 데이터베이스 복사본을 만들어야했기 때문에 실제로 어제 시도했습니다. 작은 배치로 각 분류 오기 파싱/병렬 작업으로 각각의 카테고리의 동작을 저장 이동 분할함으로써

는 I 26 분 (예상) 몇 시간에서 총 수입 시간을 단축 병렬로 실행. 길을 따라 나는 콜렉션을 분리하기위한 훌륭한 코드 조각을 발견했다 : http://www.vogella.de/articles/JavaAlgorithmsPartitionCollection/article.html

나는 태스크를 실행하기 위해 ThreadPoolTaskExecutor를 사용했다. 귀하의 작업은 Callable 인터페이스의 단순한 구현입니다.

관련 문제