Springの宣言型トランザクション管理に関する専門家の意見が必要でした。これが私の設定です:
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
のトランザクションメソッドが必要なのはなぜですか?この構成の実用的な意味はありますか?
ありがとうございました!いつものように、あなたの応答は大歓迎です!
この投稿 動作またはreadOnly
フラグが永続性メカニズムに依存していることを示します。
C。はい、Hibernateを使用する場合、フラッシュモードを_FLUSH_NEVER
_に設定することでパフォーマンスが向上します(リンクされた投稿で説明されています)
B。はい、JDBC呼び出しはトランザクションを必要としないため(Hibernateはトランザクションを必要とします)、_@Transactional
_構成を削除するとすべてのトランザクション管理が削除されます。
A。Springがconnection.setReadOnly(true)
を呼び出していると思いますが、JDBCドライバーはこれをサポートしていません
つまり、プレーンJDBCではreadonly
トランザクションを使用しないでください。
そしてもう1つ、トランザクションは複数のクエリにまたがることになっています。トランザクションをきめ細かくしすぎないでください。それらを作る 作業単位 。
A. get *を読み取り専用と言う必要がありますか?私のget *メソッドはすべて純粋な読み取りDB操作です。トランザクションコンテキストでそれらを実行したくありません。上記のエラーはどのくらい深刻ですか?
実際には、トランザクションのコンテキストですべてのget()
を実行して、一貫した読み取りが行われるようにする必要があります。一方、これを気にしない場合は、それに応じてトランザクションレベルを設定できます。
C. readonly = trueのトランザクションメソッドが必要なのはなぜですか?この構成の実用的な意味はありますか?