2017-05-16 1 views
0

Jsoup를 기반으로 파서를 만들었습니다. 이 파서는 페이지 매김이있는 페이지를 처리합니다. 이 페이지에는 예를 들어 구문 분석 할 100 개의 링크가 들어 있습니다. 페이지 매김을 반복하는 메인 루프를 만들었습니다. 그리고 비동기 작업을 실행하여 각 페이지에서 100 개의 항목을 파싱해야합니다. Jsoup은 비동기 요청 처리를 지원하지 않습니다. 각 항목을 처리 한 후 DB에 저장해야합니다. DB의 테이블에 삽입하는 동안 오류가 발생하지 않도록하고 싶습니다 (가능한 경우 스레드가 동시에 다른 항목에 동일한 ID를 사용하는 경우). 뭐라고 제안 할 수 있니? 난 그냥 당신이 내 생각을 보여주고 싶은,DB에 동시 삽입

public class Parser { 

    @Autowired 
    private MySpringDataJpaRepository repoReference; // <-- SINGLETON 

    public static void main(String[] args) { 
     int pages = 10000; 
     for (int i = 0; i < pages; i++) { 
      Document currentPage = Jsoup.parse(); 
      List<String> links = currentPage.extractLinks(); // contains 100 links to be parsed on each for-loop iteration 
      links.forEach(link -> new ItemParser(link, repoReference).start()); 
     } 
    } 
} 

나는이 코드는 컴파일 가능한 아니라는 것을 알고

public class ItemParser extends Thread { 
    private String url; 
    private MySpringDataJpaRepository repo; 

    public ItemParser(String url, MySpringDataJpaRepository repoReference) { 
     this.url = url; 
     this.repo = repoReference; 
    } 

    @Override 
    public void run() { 
     final MyItem item = jsoupParseItem(); 
     repo.save(item); 
    } 
} 

그리고이 같은 실행 나는 각 항목을 구문 분석하는 간단한 스레드 인스턴스를 사용할 수 있습니다.

아니면 스프링 배치를 사용하는 것이 더 좋을까요? 이것을 해결하는 가장 좋은 방법은 무엇입니까? 당신은 어떻게 생각하십니까?

+0

트랜잭션을 사용하면 삽입하는 동안 오류를 피할 수 있으며 트랜잭션을 사용하면 삽입 속도가 빨라집니다. –

+0

@utsavanand 및 어떤 격리 수준을 사용해야합니까? –

답변

2

행 수준 잠금을 사용하는 것이 좋습니다. 각 삽입이 트랜잭션이되도록 문제점을 줄일 수 있지만 트랜잭션의 전체적인 개념을 작업 단위로 제공하면 (즉, 단일 삽입이 실패 할 경우 전체 실행이 실패하고 롤백되기를 원합니다) 영향을 미칩니다.

또한 UUID 또는 db 생성 ID를 사용하면 충돌 문제가 발생하지 않습니다.

코드를 구조화하는 방법에 관해서는 각 작업에 Runnables와 스레드 풀 실행 프로그램을 사용하는 방법을 살펴 보겠습니다. 스레드가 너무 많으면 시스템을 효율적으로 관리 할 수 ​​없으므로 모든 스레드를 효율적으로 관리 할 수 ​​없습니다. 나는 당신이 봄을 사용하고 있음을 알아 차 렸습니다. https://docs.spring.io/spring/docs/current/spring-framework-reference/html/scheduling.html

+0

그래서 JPA 저장소를 사용하여 DB를 저장할 수 있습니다 (단, 행 레벨 잠금을 사용하려면이 저장소를 설정해야합니다). –

+0

분명히하려면 행 수준 잠금은 SQL 데이터베이스 개념입니다. 다른 스토리지 기술에는 아날로그가 있지만 SQL DB에 대해서는 데이터베이스에서 구성하는 것입니다. 예 : mysql : https://dev.mysql.com/doc/refman/5.7/en/internal-locking.html – Taylor