我使用simple-react。
在LazyFutureStream
中,我想持久化实体。
LazyFutureStream.parallel(1,2,3,4,5)
.map(id -> {
try {
SessionFactory sessionFactory = Application.getHibernateBundle()
.getSessionFactory();
ManagedSessionContext.bind(sessionFactory.openSession());
Session session = sessionFactory.getCurrentSession();
session.beginTransaction();
Model model = new Model(sessionFactory);
model.persist(id);
session.getTransaction().commit();
}
});
正确吗?是否有任何方法可以跳过每个线程的会话工厂创建?
同样在上面,我只想分叉,但不想加入。这样行吗?
我是simple-react的作者,虽然我绝对不是Hibernate的SessionFactory的专家,但是这些Stackoverflow的帖子确实建议跨线程共享它们是安全的。
-
为什么每个应用程序只使用一个SessionFactory对象?
-
为什么Hibernate's sessionFactory是线程安全的
优化你的流
LazyFutureStream。parallel使用Common ForkJoinPool(与标准Java 8并行流相同)。因此,如果您在应用程序的其他地方使用它们(特别是CPU绑定任务),它们将与阻塞I/O竞争。
LazyReact StreamBuilder
你可以使用LazyReact流构建器来设置一个使用自定义线程池的流构建器(并且重用构建器,JVM在垃圾收集线程池方面做得并不好)。
设置一个带有10个线程池的流构建器,并且允许10个活动的future -
LazyReact streamBuilder = new LazyReact(10,10);
创建流
Holger建议您可以使用forEach(这在simple-react v0.99上是有效的)。在以前的版本中,peek/run组合将执行得更好)
streamBuilder.of(1,2,3,4,5)
.forEach(id-> { //do work here });
这将在您的线程池上执行,但将阻塞当前线程,直到工作完成。
对于一个非阻塞的选择,你可以使用run()和peek。
streamBuilder.of(1,2,3,4,5)
.peek(id-> { //do work here })
.run();