私はguiとdbに保存されている在庫のリストを持つアプリケーションを持っています。私は1 EntityManagerを使用して、アプリケーションが実行されている間、新しい株を削除、変更、追加します。私は定期的に株式の実際の株式コースをつかみ、それらをdbに保存するスレッドを持っています。スレッドで別のエンティティマネージャを使用します(スレッドの安全性の原因)。マルチスレッドJPAアプリケーションでのMerge()
これは、株式の操作(削除、変更、在庫コースの表示など)を行うことを意味します。メインエンティティマネージャーは、他のストックコースを知らないので、まずマージを呼び出す必要があります。問題は今、プログラムが長時間実行されていて、ユーザーが株式を何もしたことがない場合、最初にマージする必要のある数千の新しいコースがあり、非常に長い時間(> 10秒)がかかることです。これについて私は何ができますか?あるいは私はそれを間違ってやっているのですか?もっと良い方法がありますか?
編集:stockPriceModelで
// grabbing the actual stockprice and making actualStockPrice with it
....
// adding the correct stock to the new stockprice
actualStockPrice.setStock(stock);
// adding stockprice to stock
stock.getActualStockPrices().add(actualStockPrice);
// Saving new price to db (stockPriceModel has it's own em)
stockPriceModel.saveActualStockPrice(actualStockPrice);
saveActualStockPrice:それは私が私のスレッドで各5分間何をすべきか、基本的だ
transaction.commit();
transaction.begin();
em.persist(actualStockPrice);
私はの残りの部分で、その後、私のスレッドで別のEntityManagerを使用して原因私のアプリケーションは、今私の主なemで私はデータで何かを行う前にmerge()を呼び出さなければならないということを知らないデータ(すなわち、データベースに保存されたすべてのstockPricesを持っている)。私がそれをしなければ、私は自分がコミットするとすぐに新しいStockPricesを挿入しようとします。問題は、私が長いこと何かをコミットしないと、merge()が永遠に取るような非常に分離されたstockPrices(数千人と言う)があるということです。そして今私は何をすべきか分かりません。
エンティティモデルを説明するコード例を投稿してください。どの文が遅いものであるか、いくつかの例を挙げてください。 – wrschneider