0

Spring MVC では、ほとんどの JPA entity(ドメイン レイヤーから) 操作をserviceレイヤーの下に置き、ほとんどのCRUDアクションで、そのサービス メソッドまたはクラスを作成する必要があります@Transactional

しかし、考えてみると、通常のファインダーメソッドの場合、

MyEntity myEntity = MyEntity.findByAliceAndBob(Alice alice, Bob bob);

質問は次のとおりです。

  1. @Transactional メソッドの下に置く必要がありますか?
  2. 必要ではなく、それでもそうしている場合、パフォーマンス コストは発生しますか?
  3. 必要がない場合は、ファインダーメソッドをコントローラーに呼び出してみませんか?
4

2 に答える 2

1

その決定に貢献するものはたくさんあります。

1) オープンなエンティティ マネージャー フィルターを使用していますか、それとも自動コミット モードですか?

開いている持続性セッションがない場合、自動コミット モードで持続性操作を実行するたびに、まったく新しいものをゼロから構築してから破棄していることになります。これはすぐに加算できます。この場合、特定のコントローラーが行うすべての読み取りを単一のトランザクションにグループ化すると便利です。これは、それが「洗練されておらず」、SpringMVC が提供する「きれいな」抽象化を台無しにしている場合でも同様です。

2) JPA ダイアレクトは readOnly トランザクションをサポートしていますか?

@Transactional(readOnly = true)これは、特に多数のエンティティがロードされている場合に、自動コミット モードでクエリを実行するよりもパフォーマンスを向上させるのに役立ちます。

3) 分散トランザクションはありますか?

JTA サーバーに接続して分散トランザクションを開始することは、ローカルのアトミック読み取りにはおそらく価値がありません。

4) 結果がキャッシュされる可能性はありますか?

Spring 宣言型トランザクションを使用すると、Spring がデータベース接続を取得し、永続化プロバイダーが意図した操作が何かを知る前にトランザクションを開始するという問題があります。結果が実際に永続化プロバイダのメモリに格納されていて、この特定の操作のためにデータベースと対話する必要がない場合、それは少し無駄な労力になる可能性があります。(これについて心配するのはかなり積極的なマイクロ最適化の IMO です。問題が発生し始めると、アプリ サーバーはおそらくかなり飽和状態になります。)

于 2013-05-02T17:47:00.457 に答える