假设我有一个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数据库。
答案 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容器通常不适合/善于此类事情。