web-dev-qa-db-ja.com

Spring-トランザクション読み取り専用

Springの宣言型トランザクション管理に関する専門家の意見が必要でした。これが私の設定です:

  1. DAOレイヤーはSpringJdbcTemplateを使用したプレーンな古いJDBCです(Hibernateなしなど)
  2. サービス層はPOJOであり、次のような宣言型トランザクションがあります-save*, readonly = false, rollback for Throwable

上記の設定で問題なく動作します。ただし、get*, readonly = trueと言うと、ログファイルにDatabase connection cannot be marked as readonlyというエラーが表示されます。これは、サービスレイヤーのすべてのget *メソッドで発生します。

今私の質問は次のとおりです。

A. get*を読み取り専用に設定する必要がありますか?私のget*メソッドはすべて、純粋な読み取りDB操作です。トランザクションコンテキストでそれらを実行したくありません。上記のエラーはどのくらい深刻ですか?

B. get*構成を削除しても、エラーは表示されません。さらに、私の単純なget*操作はすべて、トランザクションなしで実行されます。これは行く方法ですか?

C. readonly = trueのトランザクションメソッドが必要なのはなぜですか?この構成の実用的な意味はありますか?

ありがとうございました!いつものように、あなたの応答は大歓迎です!

23
AAK

この投稿 動作またはreadOnlyフラグが永続性メカニズムに依存していることを示します。

C。はい、Hibernateを使用する場合、フラッシュモードを_FLUSH_NEVER_に設定することでパフォーマンスが向上します(リンクされた投稿で説明されています)

B。はい、JDBC呼び出しはトランザクションを必要としないため(Hibernateはトランザクションを必要とします)、_@Transactional_構成を削除するとすべてのトランザクション管理が削除されます。

A。Springがconnection.setReadOnly(true)を呼び出していると思いますが、JDBCドライバーはこれをサポートしていません

つまり、プレーンJDBCではreadonlyトランザクションを使用しないでください。

そしてもう1つ、トランザクションは複数のクエリにまたがることになっています。トランザクションをきめ細かくしすぎないでください。それらを作る 作業単位

23
Bozho

A. get *を読み取り専用と言う必要がありますか?私のget *メソッドはすべて純粋な読み取りDB操作です。トランザクションコンテキストでそれらを実行したくありません。上記のエラーはどのくらい深刻ですか?

実際には、トランザクションのコンテキストですべてのget()を実行して、一貫した読み取りが行われるようにする必要があります。一方、これを気にしない場合は、それに応じてトランザクションレベルを設定できます。

C. readonly = trueのトランザクションメソッドが必要なのはなぜですか?この構成の実用的な意味はありますか?

  1. Get() `メソッド内の誤った書き込みから保護するため
  2. 最適化の目的で。 Bozhoが述べたように、Hibernateはこの情報を利用できるだけでなく、一部のデータベース/ JDBCドライバーもこの情報を利用できます。
5
matt b