Java 并发插入数据库

Java 并发插入数据库,java,jsoup,spring-batch,java.util.concurrent,Java,Jsoup,Spring Batch,Java.util.concurrent,我制作了一个基于Jsoup的解析器。此解析器处理分页页面。例如,此页面包含100个要分析的链接。我创建了一个用于分页的主循环。我需要运行异步任务来解析每个页面上100个项目中的每一个。据我所知,Jsoup不支持异步请求处理。处理完每个项目后,我需要将其保存到DB。我希望避免在插入DB表时出错(如果可能的话,线程将同时对不同的项使用相同的id)。你有什么建议? 我是否可以使用简单线程实例来解析每个项目: public class ItemParser extends Thread { pr

我制作了一个基于Jsoup的解析器。此解析器处理分页页面。例如,此页面包含100个要分析的链接。我创建了一个用于分页的主循环。我需要运行异步任务来解析每个页面上100个项目中的每一个。据我所知,Jsoup不支持异步请求处理。处理完每个项目后,我需要将其保存到DB。我希望避免在插入DB表时出错(如果可能的话,线程将同时对不同的项使用相同的id)。你有什么建议? 我是否可以使用简单线程实例来解析每个项目:

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());
        }
    }
}
公共类解析器{
@自动连线
private MySpringDataJpaRepository reporterence;//新建项解析器(link,reporterence.start());
}
}
}
我知道这段代码是不可编译的,我只是想告诉你我的想法

或者使用Spring Batch更好? 解决这个问题的最佳实践是什么?
您认为呢?

如果使用行级锁定应该可以。将每个插入作为一个事务可能会避免问题,但考虑到事务作为一个工作单元的整个概念(即,如果单个插入失败,是否希望整个运行失败并回滚?)

此外,如果使用UUID或db生成的ID,则不会出现任何冲突问题


至于如何构造代码,我将考虑为每个任务使用可运行程序,以及线程池执行器。线程太多,系统将失去管理所有线程的效率。我注意到您使用的是spring,因此,如果您使用行级锁定,请查看一下。将每个插入作为一个事务可能会避免问题,但考虑到事务作为一个工作单元的整个概念(即,如果单个插入失败,是否希望整个运行失败并回滚?)

此外,如果使用UUID或db生成的ID,则不会出现任何冲突问题


至于如何构造代码,我将考虑为每个任务使用可运行程序,以及线程池执行器。线程太多,系统将失去管理所有线程的效率。我注意到你用的是弹簧,请看一看

您可以使用事务避免插入过程中的错误,如果您使用事务,插入将非常快。@utsavanand和我应该使用哪种隔离级别?您可以使用事务避免插入过程中的错误,如果您使用事务,插入将非常快。@utsavanand和哪种隔离级别我应该使用的级别?因此,可以使用数据JPA存储库来保存数据库(但在我应该设置此repo以使用行级别锁定之前)?很明显,行级别锁定是sql DB的概念。其他存储技术中也有类似的技术,但对于sql dbs,它是在数据库中配置的。例如,mysql:所以,可以使用数据JPA存储库来保存DB(但在我应该设置此repo以使用行级锁定之前)?很明显,行级锁定是sql DB的概念。其他存储技术中也有类似的技术,但对于sql dbs,它是在数据库中配置的。例如,mysql: