2009-07-30 11 views
5

私はHibernateでバックアップされたJPAを永続性レイヤーとして使用しています。私はSoapコールからデータを集約し、データベースに行を格納するマルチスレッドプロセスを持っています。プロセスは、通常、約700行の挿入を終了し、石鹸呼び出しが主要なボトルネックとなっているため、約1〜3時間かかります。JPA挿入によってデータベーステーブルがロックされないようにするにはどうすればよいですか?

このプロセス全体で、私が挿入するテーブルをロックして、select文を適時に返しません。ここで

は、SQLサーバーのエラーです:

Error Message: Lock request time out period exceeded.

私はこの長いプロセスの間、私のデータベーステーブルをロック避けるにはどうすればよいですか?

答えて

1

と同じトランザクションで700行を挿入しますか?

トランザクションの境界はどこですか?おそらくトランザクション境界線を下げることができれば、つまり実際の挿入操作だけをトランザクションすることができれば、ロックは強く保持されます。

プロセス全体をアトミックにする必要がある場合は、それを一時テーブルに書き込んだ後、一括挿入(高速)してメインテーブルに挿入することが考えられます。

+0

私は自分のトランザクションの境界が不明です。私はトランザクションを必要とするDAOメソッドに@transactionalを持っていますが、DAOを使用するコードへのエントリポイントには@transactionalもあります。前者を削除すると、トランザクションエラーは発生しません。それは私が現在調査中のものです。 @stackoverflow.com/questions/807457/ –

+0

をチェックしてください。@Transactionalが非常に遠すぎました。一度削除すると、データベースをロックせずに正常に動作しています。私はまだいくつかの奇妙な問題を抱えています@トランザクション、しかし、私はそれを解決するだけで、より小さいトランザクションに依存しています。この質問は、http://stackoverflow.com/questions/1079114でも参考になりました。 –

2

おそらく、分離レベルを変更する必要があります。ここで

は、いくつかの情報です: http://www.interview-questions-tips-forum.net/index.php/Your-Questions-on-Java/JDBC-Transaction/Transaction-Isolation-Levels

それは別の分離レベルの話、そして、彼らはに対してガードを助けることができるもの。これを行う一般的な方法は、strictistで始めることですが、データの整合性/偽の読み取りの要件を念頭に置いて、レスポンスタイムを改善する必要がある場合は低くします。

編集

春のトランザクションレベルは、トランザクションマネージャで抽象JDBC(または何でも)トランザクション分離レベルに使用されています。それらはTransactionDefinitionクラスで定義され、静的メンバーです。

TransactionDefinition.ISOLATION_DEFAULT 
Default isolation 

TransactionDefinition.ISOLATION_READ_UNCOMMITTED 
Lowest level of isolation; allows transactions to see uncommitted modifications from other transactions 

TransactionDefinition.ISOLATION_READ_COMITTED 
Cannot read uncommitted data 

TransactionDefinition.ISOLATION_REPEATABLE_READ 
Ensures repeatable reads 

TransactionDefinition.ISOLATION_SERIALIZABLE 
Most reliable; all transactions are executed atomically, and are treated as though they occurred serially. 

トランザクションの伝播レベルもあります。あなたはトランザクションが不要な純粋な読み取りのトランザクションを使用している可能性があります。読み取りはトランザクションを必要とせず、書き込みは常にそれらの周りのトランザクションを持つ必要があります。伝播レベルはTransactionDefinitionでも明確です。これらは通常、バネ配線ファイルで使用され、特定の呼び出しのシリアル化と伝播を定義します。あなたの配線の例があるなら、私はいくつかのヒント/情報を与えることができるかもしれません。

+0

Springトランザクションマネージャを使用している場合は、トランザクションDAOをセットアップするときに、トランザクションコールごとに分離レベルを設定できます。 – aperkins

+0

本当に、それを拡張したり、それを拡張する記事の指示に私を向けることができますか? –

+0

Rob HarropとJan Machacekが参考書「Pro Spring」から得たすべてのSpring情報。非常に乾燥した本ですが、それは本当に良いインデックスを持つ春のための良いリファレンスピースです。それは最終的に私のためにトランザクションを "クリック"した本でした - それはしばらく時間がかかりました:) – aperkins

0

1回のJPAトランザクションで700件のSOAPリクエストを作成しようとしていますか?それをしないでください。 :-)

+0

いいえ、プログラムはSOAP呼び出しを行い、結果をデータベースに報告します。トランザクションはSpringによって処理されます。 –

関連する問題