2012-02-13 7 views
0

私は、Hibernateのデフォルトのトラバーサルリゾルバを使ってエンティティのリストを検証するときに、データベースをたくさん呼び出す可能性のあるメソッドを持っています。注釈を@Transactionalに付けると、それはほぼ4倍速く実行されます。いくつかの質問:なぜSpringの@Transactionalヘルプのパフォーマンスが良いですか

1)なぜ高速ですか?

2)メソッドをトランザクションにすることなく、スピードアップをどのように再現できますか?私はトランザクションでこのメソッドをラップする必要はまったくなく、トランザクションにすることはメソッドの本意とは逆です。

+1

おそらくトランザクション変更dbの書き込み数を減らします(減らします)?基礎となるSQLコマンドのデバッグ・ロギングをオンにして調べることができます。 – Kevin

+0

これは読み取り専用の状況です。ただし、Hibernateのトラバーサルリゾルバがインスタンス化される回数を減らすようには見えませんが、各インスタンス間の時間が短縮されます。 – Derek

+3

私はそれがハイバネーションセッションに関係していると信じています。非常に高価なオブジェクトなので、すべてのコールに対して作成されたセッションが1つだけあることを確認する必要があります。 '@ Transactional'は常にそうですが、OpenSessionInViewフィルタを使って手動で行うことができなければ、おそらく他の手段があります。また、 '@ Transactional'を避ける理由もありません。 – mrembisz

答えて

1

私は、あなたのデータベースロジックがトランザクションを必要としていると考えています。 Springがあなたの注釈に基づいてトランザクションを作成するなど、進行中のトランザクションがある場合、これらの操作はそれに参加します。進行中のトランザクションがない場合、接続を開始し、トランザクションを開始し、それぞれの呼び出しでHibernateセッションを設定するプロセスを経なければなりません。

これはあなたの方法の意図とはどのように違うのですか?

+0

ロジックはトランザクションではありません - 私は何も必要ありませんある種のアトミック性は、複数のエンティティをループして、すでにデータベースに入っているかどうかを確認するだけです。このメソッドの目的は、渡されたすべてのエンティティがDBにまだ存在しないことを確認することです。メソッドが@Transactionalの場合、それはRollbackOnlyとしてマークされ、私が望むやり方に進むことはできません。 – Derek

+0

同じトランザクションでチェックして挿入しないのはなぜですか?これは、望ましいトランザクション分離のための教科書のケースです。 – Olaf

関連する問題