【发布时间】:2018-06-23 05:24:48
【问题描述】:
假设我有一个 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);
}
}
有办法吗? 代码在 Wildfly 上运行,带有 Hibernate 持久性单元和 Postgresql 数据库。
【问题讨论】:
-
这可能不起作用,因为运行子任务的池线程将没有正确的上下文。此外,流库是为 数据并行 而设计的,而不是 IO 并行。因此,您也不太可能获得您认为会获得的并行性。
-
感谢您的意见!事实上,流正是我打算并行化工作的方式。这里的主要目标是在单个事务中并行执行插入,不一定使用流。也改了标题。
标签: jpa java-8 jpa-2.0 ejb-3.1 java-ee-7