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);
}
}
그리고이 같은 실행 나는 각 항목을 구문 분석하는 간단한 스레드 인스턴스를 사용할 수 있습니다.
아니면 스프링 배치를 사용하는 것이 더 좋을까요? 이것을 해결하는 가장 좋은 방법은 무엇입니까? 당신은 어떻게 생각하십니까?
트랜잭션을 사용하면 삽입하는 동안 오류를 피할 수 있으며 트랜잭션을 사용하면 삽입 속도가 빨라집니다. –
@utsavanand 및 어떤 격리 수준을 사용해야합니까? –