Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何通过JPA和Hibernate使用多个处理线程持久化实体_Java_Multithreading_Spring_Hibernate_Transactions - Fatal编程技术网

Java 如何通过JPA和Hibernate使用多个处理线程持久化实体

Java 如何通过JPA和Hibernate使用多个处理线程持久化实体,java,multithreading,spring,hibernate,transactions,Java,Multithreading,Spring,Hibernate,Transactions,有一个作业正在单线程环境中运行。这意味着我有main方法,主线程负责完成任务 我正在使用Spring和Hibernate 在高层,我正在执行以下步骤: 使用JDBC从MySQL数据库获取数据(循环resultset并执行第2点和第3点) 使用从第1点接收的数据填充模型 验证、调用服务层、dao层以及在oracle数据库中存储实体 此流使用for循环。因此,一个接一个的数据插入是存在的 现在我想使用多线程来实现这一点 方法: 一个线程将获取数据并填充模型对象并将其放入队列中 多个线程将对象从队列和

有一个作业正在单线程环境中运行。这意味着我有main方法,主线程负责完成任务

我正在使用Spring和Hibernate

在高层,我正在执行以下步骤:

  • 使用JDBC从MySQL数据库获取数据(循环resultset并执行第2点和第3点)

  • 使用从第1点接收的数据填充模型

  • 验证、调用服务层、dao层以及在oracle数据库中存储实体

  • 此流使用
    for
    循环。因此,一个接一个的数据插入是存在的

    现在我想使用多线程来实现这一点

    方法:

  • 一个线程将获取数据并填充模型对象并将其放入队列中

  • 多个线程将对象从队列和起点3中退出队列


  • 你能帮我实现这个模型吗。如何编写这种类型的多线程框架。

    您需要一个单生产者多消费者线程安全队列。看一看,那是最适合你的衣服

    LMAX Disruptor是一个高性能线程间消息传递库,它是底层数据结构中用于工作人员内部通信的默认消息传递系统,是一个无锁环形缓冲区。为了使它快速,它使用


    按照,您可以参考一个非常简单的示例。

    您可以这样做:

  • 定义执行器服务:

     ExecutorService executorService = Executors.newFixedThreadPool(10);
    
  • 对于迭代的每个
    ,只需提交要插入的新对象即可

     final RecordDTO record = ...;
     executorService.execute(new Runnable() {
         public void run() {
             insertService.save(record);
         }
     });
    
  • insertService
    将有一个
    @Transactional
    save
    方法来使用这10个工作线程中的一个插入每条记录

  • 连接池大小应大于或等于工作线程数


  • 然而,使用JDBC要高效得多。因此,您可以发送多个条目,以便在一个批中插入所有条目,而不是只向工作线程发送一个实体。

    在插入之前,我必须验证并填充模型对象上的某些内容。我也希望它是多线程的。所以在运行内部,我必须在内部调用processAcc(model)和processAcc(model)call.save。因此这里processAcc(model)我的模型不能是最终的..现在在处理阶段的同步块中执行验证阶段,因为存在并发环境。可以使用storm拓扑,可以为螺栓设置不同的并行度(N个执行器)以进行快速处理。它还支持分布式计算/容错/有保证的消息处理。非常容易实现。现有的java代码将在那里重用。每个逻辑步骤的Spring线程池执行器如何?