Ich machte einen Parser basierend auf Jsoup. Dieser Parser behandelt eine Seite mit Paginierung. Diese Seite enthält beispielsweise 100 zu analysierende Links. Ich habe eine Hauptschleife erstellt, die die Seitennummerierung umgeht. Und ich muss asynchrone Tasks ausführen, um jedes der 100 Elemente auf jeder Seite zu analysieren. Wie ich es verstehe, unterstützt Jsoup keine Async-Anfragen. Nachdem ich jedes Element bearbeitet habe, muss ich es in der DB speichern. Ich möchte Fehler beim Einfügen in DB-Tabelle vermeiden (wenn Threads die gleiche ID für verschiedene Elemente zur gleichen Zeit verwenden, wenn es möglich ist). Was können Sie vorschlagen? kann ich einfach Thread-Instanz jedes Element zu analysieren:Gleichzeitige Einfügen in 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);
}
}
Und wie laufen:
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());
}
}
}
Ich weiß, dass dieser Code nicht übersetzbar ist, ich möchte nur meine Idee zeigen.
Oder vielleicht ist es besser Spring Batch zu benutzen? Was ist die beste Vorgehensweise, um dies zu lösen? Was denkst du?
Sie können Transaktion verwenden, um Fehler beim Einfügen und Einfügen zu vermeiden, wird wirklich schnell, wenn Sie Transaktion verwenden. –
@utsavanand und welche Art von Isolationsstufe sollte ich verwenden? –