2012-02-17 6 views
2

標準のドメインオブジェクトを持つ標準のSpring Roo(1.2.0.RC1)プロジェクトがあります。私の主なスレッド(ドメインコントローラ)では、データベースにバックアップされたドメインオブジェクト(Hibernate/MySQLを使用しています)のインスタンスをファインダを使用して作成し、いくつかのプロパティを変更し、変更を.persist()保存されるインスタンスに適用されます。新しいスレッドでSpring Rooで.persist()が動作しない

このロジック全体をRunnableに移動し、新しいスレッド(ScheduledThreadPoolExecutor.scheduleAtFixedRate()によって呼び出される)で実行すると、ファインダを使用してドメインオブジェクトのインスタンスを適切に作成できますが、保存するオブジェクトの.persist()を呼び出しても、DBには影響しません。コンソールログ(STS内で実行中)に何も表示されません。 Rooが作成する他のログファイルがあるかどうかは分かりませんが、これは何が起こっているかについての手がかりを与えてくれます。他の誰かが前述の問題を経験しましたか? RooのSTSコンソール(Hibernateクエリログなど)でより詳細なログを取得する方法を知っている人はいますか?

+0

コードを表示します。また、Hibernate Sessionはシングルスレッドオブジェクトであり、トランザクションコンテキストはThreadLocal変数に依存することに注意してください。 –

+0

詳細については、hibernateプロパティshow-sqlをpersistence.xmlに追加してください。 – Ilya

+0

はい、Hibernateセッションは通常、ThreadLocal変数として保存されます。したがって、新しいスレッドで作成するオブジェクトにはHibernateセッションがありません。 – GreyBeardedGeek

答えて

0

これはトランザクションと関係があります。 HibernateやJTAのデフォルトでは、スレッドにバインドされているローカルトランザクションを使用します。本当に、スレッド間でトランザクションを共有しようとするべきではありません。スレッド間で共有しているオブジェクト(休止状態のセッション?)は、スレッドセーフではないと思います。

コードを単純化し、複数のスレッドで更新を処理しないようにします。複数のスレッドを使用する必要がある場合は、それぞれ独自のトランザクションを持つ必要があります。

スレッドごとに新しいトランザクションが必要です。しかし、それであなたはあなたのスレッドからデータを選択することができますが、永続化することはできません。スレッド内のトランザクションが閉じられていないようです。

関連する問題