1

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

这个对吗 ?有什么办法可以跳过每个线程的会话工厂创建。

同样在上面我只想分叉而不是加入。可以吗?

4

1 回答 1

1

我是 simple-react 的作者,虽然我绝对不是 Hibernate 的 SessionFactory 方面的专家,但这些 Stackoverflow 帖子确实表明跨线程共享它们是安全的。

优化您的流

LazyFutureStream.parallel 使用 Common ForkJoinPool(与标准 Java 8 并行流相同)。因此,如果您在应用程序的其他地方使用这些(尤其是 CPU 密集型任务),它们将与您的阻塞 I/O 竞争。

LazyReact StreamBuilder

您可以使用 LazyReact Stream Builder 来设置使用自定义线程池的 Stream 构建器(并重用该构建器,JVM 在垃圾收集线程池方面做得不好)。

要设置具有 10 个线程的线程池的 Stream 构建器,并允许 10 个活动期货 -

    LazyReact streamBuilder = new LazyReact(10,10);

创建您的信息流

正如 Holger 建议的那样,您可以使用 forEach (这在 simple-react v0.99.x 及更高版本上很有效,在以前的版本中,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();
于 2015-09-22T22:20:22.430 回答