是否可以使用JavaEE 7在单个事务中并行/合并实体?

时间:2018-01-14 09:58:07

标签: jpa java-8 jpa-2.0 ejb-3.1 java-ee-7

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

@Stateless
public class BusinessBean {

  @Inject
  private CrudService crudService;

  public void savePosts(Collection<Post> posts) {
      posts.parallelStream().forEach(post ->
          crudService.createPost(post);
  }
}

我希望能够在单个事务中并行创建/更新Post实体的集合。一种不起作用的方法,对于池中的每个线程,容器创建一个新事务,如下所示:

{{1}}

有办法吗? 该代码在Wildfly上运行,具有Hibernate持久性单元和Postgresql数据库。

1 个答案:

答案 0 :(得分:1)

直接&#34;这里是答案&#34;答案。

不是一般的。看看这个问题的答案:Is it discouraged using Java 8 parallel streams inside a Java EE container?

烦人的&#34; XY problem&#34;答案。

您认为这会起作用吗?大多数数据库不支持单个数据库连接上的多个并行事务,我不相信PG支持它:https://stackoverflow.com/a/289057/924597

所以某事/某人(JEE容器,JDBC,驱动程序等)必须打开多个数据库连接来实现这一点 - 我认为你说的是​​发生了什么?如果您在许多不同的业务操作中执行此操作,则可能会很快耗尽您的连接池。

本着这是一个&#34; XY问题&#34;回答 - 你想解决什么问题?

如果它只是原始吞吐量问题 - 请考虑批量插入。

如果它是批量插入问题 - 考虑在您的容器周围运行并使用不同的工具,JEE容器通常不适合/善于此类事情。