私はJsoupに基づいてパーサを作った。このパーサは、ページ番号付きのページを処理します。このページには、たとえば、解析される100のリンクが含まれています。私は改ページを行うメインループを作成しました。そして、私は非同期タスクを実行して、各ページの100項目を解析する必要があります。私が理解するように、Jsoupは非同期要求処理をサポートしていません。各アイテムを処理した後、DBに保存する必要があります。 DBのテーブルに挿入中にエラーが発生しないようにしたいと考えています(可能であれば、スレッドは異なるアイテムに対して同じIDを同時に使用します)。あなたは何を提案できますか?DBへの同時挿入
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);
}
}
そして、このように実行します: は、私は、各項目を解析するために、単純なスレッドのインスタンスを使用することができ
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());
}
}
}
私はこのコードはコンパイル可能ではないことを知っている、私はあなたに私の考えを示したいと思います。
または、バネバッチを使用する方がよいでしょうか? これを解決するベストプラクティスは何ですか? あなたはどう思いますか?
トランザクションを使用すると、挿入中にエラーを回避し、トランザクションを使用すると挿入が非常に高速になります。 –
@utsavanandとはどのような分離レベルですか? –