2012-03-06 10 views
0

私は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(数千人と言う)があるということです。そして今私は何をすべきか分かりません。

+0

エンティティモデルを説明するコード例を投稿してください。どの文が遅いものであるか、いくつかの例を挙げてください。 – wrschneider

答えて

0

私はあなたが望むものを少し推測する必要がありますが、私は試してみます。私が持っている1つの問題は、「ストックコース」が何であるかわからないことです。私はそれが株式に関する情報の一部であると仮定しています。

私が正しくお読みになりましたら、株式に関する情報がありますが、頻繁に更新された情報を入手します。何らかの理由で、ユーザーが何か操作を行うまで元々持っていた株価情報を更新しません。私はあなたの問題がどこにあるのかと推測しています。

新しい情報を入手したらすぐに、元の情報を新しい情報で更新することをお勧めします。これは、情報を更新するオブジェクトのスレッドを同期させることで可能になります。たとえば、1つの株式に関するすべての情報を表すクラスがあり、現在の値をデータベースに保持するメソッドがある場合、それらのメソッドへのアクセスを同期させて、2つのスレッドが更新を試みないようにすることができます情報を同時に更新することができ、それによって情報を相互更新する2つの方法の問題を回避することができる。

私はあなたのUIがすぐに更新を取得しないことに驚いています。おそらくそれはしますが、あなたのデータベースはそうではありません。私が言うように、あなたの現在の記述からあなたがプログラムでやっていることを正確に理解するのは難しいです。

+0

在庫列はstockPricesです。私は2つの単語を同じものに使用しています:/基本的にguiはリスト株式の名前(名前など)とリスト内の各株式は、5分ごとに新しく取得したStockpriceで更新されます。私の最初の投稿の私のコードは、これを行います(それは、適切な株式に新しい株価を加え、新しい株価オブジェクトに適切な株式を追加して、新しい株価をdbに保存します)。今私の問題は、私は2つのエンティティマネージャがあることです。 –

+0

実際の株価をテーブルに書き込むスレッドと、アプリで他のすべてのことを行うスレッドです。私は今私の主なemと何かをコミットするときにもdbの新しい株価を保存しようとするが、新しい株価はモデルにあるが、私の主なemはdbにはないと思う。だからこそ私はコミットする前にマージを使用しなければならないので、彼は新しいストックビットを得て、それらを再び追加しようとしません。しかし、長い間ユーザーが何もしていなければ、新たな在庫が多くなり、次のコミット(マージ)は「永遠」になります。 –

+0

申し訳ありませんが、あなたが何を言おうとしているのか分かりません。 "実際の株価をテーブルに書き込む" - dbテーブルまたはJTable?または他のテーブル? "他のすべてをする" - 何? "主なem" - それはどちらですか? "彼は決して彼らを犯さなかったから" - 彼は誰ですか?何故なの? "...彼が手に入るように" - 彼は誰ですか? "新しい株価がたくさんあるだろう"どこに?それらをモデルとデータベースに書き込むスレッドがあります。スタックはどこにありますか?なぜあなたは2つのエンティティマネージャを持っていますか?私は3段階を取り上げて、あなたが何を高レベルでやろうとしているのかを記述する時が来たと思います。あなたの実装が現在行っていることから、 – arcy

関連する問題