Jpa 是否可以使用JavaEE7在单个事务中并行地持久化/合并实体?

Jpa 是否可以使用JavaEE7在单个事务中并行地持久化/合并实体?,jpa,java-8,jpa-2.0,ejb-3.1,java-ee-7,Jpa,Java 8,Jpa 2.0,Ejb 3.1,Java Ee 7,假设我有一个EJB CrudService,其中包含对单个实体(而不是集合)执行CRUD的方法。CrudService中注入了EntityManager,无法对其进行修改。 CrudService看起来像这样: @Stateless public class CrudService { @PersistenceContext(name = "TxTestPU") private EntityManager em; public Integer createPost(Post po

假设我有一个EJB CrudService,其中包含对单个实体(而不是集合)执行CRUD的方法。CrudService中注入了EntityManager,无法对其进行修改。 CrudService看起来像这样:

@Stateless
public class CrudService {

  @PersistenceContext(name = "TxTestPU")
  private EntityManager em;

  public Integer createPost(Post post) {
     post = em.merge(post);
     return post.getId();
  }

  public void updatePost(Post post) {
      em.merge(post);        
  }

  public Post readPost(Integer id) {
      return em.find(Post.class, id);
  }

  public void deletePost(Post post) {
      em.remove(post);
  }
}
我希望能够在单个事务中并行地创建/更新Post实体集合。对于池中的每个线程,容器都会创建一个新事务,这种方法不起作用,如下所示:

@Stateless
public class BusinessBean {

  @Inject
  private CrudService crudService;

  public void savePosts(Collection<Post> posts) {
      posts.parallelStream().forEach(post ->
          crudService.createPost(post);
  }
}
@无状态
公共级商务豆{
@注入
私人CrudService CrudService;
公共作废保存栏(收集栏){
posts.parallelStream().forEach(post->
crudService.createPost(post);
}
}
有办法吗? 代码在Wildfly上运行,带有Hibernate持久化单元和Postgresql数据库。

直接的“这里有答案”答案。

不是一般性的。看看这个问题的答案:


烦人的”回答。

您认为这将如何工作?大多数数据库不支持单个数据库连接上的多个并行事务,我认为PG不支持:

因此,某些人(JEE容器、JDBC、驱动程序等)必须打开多个DB连接才能实现这一点——我想你是说发生了什么?如果你在许多不同的业务操作中这样做,这可能会很快耗尽你的连接池

本着这是一个“XY问题”答案的精神——你想解决什么问题

如果只是一个原始的吞吐量问题——考虑批量插入。


如果是一个大容量插入问题——考虑在容器周围运行一个终端,使用一个不同的工具,JEE容器通常不适合这样的事情。

这可能不起作用,因为子任务运行的池线程将没有正确的上下文。此外,流库是为数据并行设计的。sm,而不是IO并行性。因此,您也不太可能获得您认为将获得的并行性。感谢您的输入!事实上,流正是我打算并行化工作的方式。这里的主要目标是在单个事务中并行执行插入,而不必使用流。也更改了标题。问题是吞吐量,确实如此。我也考虑过插入批处理,但集合大小不同,我无法直接访问PU定义。这就是为什么我要从“外部”搜索解决方案CrudService。是的,当前从fork-join池中获得一些处理实体集合的工作的每个线程都有自己的DB事务。@cristian3181763关于“我没有直接访问PU定义的权限”如果你真的有一个必须处理的吞吐量问题——忘记PU,直接进入JDBC数据源或连接。考虑围绕你的潜在问题提出一个新的问题。并行化你的解决方案可能是正确的方法——但是使用流并行化事务可能是错误的。ree.感谢您的输入!Streams只是一种快速拆分工作的方法。我可能使用了其他方法。问题与Streams无关,而是在同一事务中并行地持久化大量实体集合。