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 Builder をセットアップできます (そして、ビルダーを再利用します。JVM はガベージ コレクション スレッド プールの優れた仕事をしません)。

10 個のスレッドのスレッド プールを使用して Stream ビルダーをセットアップし、10 個のアクティブな Future を許可するには -

    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 });

これはスレッド プールで実行されますが、作業が完了するまで現在のスレッドがブロックされます。

非ブロッキングの代替手段として、peek で run() を使用できます。

   streamBuilder.of(1,2,3,4,5)
                 .peek(id-> { //do work here })
                 .run();
于 2015-09-22T22:20:22.430 に答える