LazyFutureStream和多线程持久化



我使用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();

最新更新