2017-05-11 3 views
0

私は自分のコードに次の行を持っている:Spring JPAのキャッシュ - リポジトリから同じリソースを数回取得するのは避けるべきですか?

String productName = Utils.getProductName(productId, productRepository, language); 

このutilのメソッドは、メソッドfindOne(productId)を使用して製品を取得しますが、うまくいくつかの追加のロジックを持っています。私のコードの複数の場所で使用されています。一つの場所で

、数行下、私はProductオブジェクトを必要とするので、私は次のようにします。

ここ
Product product = productRepository.findOne(productId); 

を私は再び製品を取得するので、私たちは再びデータベースに同じ作用を有します。しかし、JPA(Hibernate)がオブジェクトをキャッシュするので、私はそれを心配する必要はないと信じています。パフォーマンスは影響を受けません。私は正しい?

もちろん、私はこのような重複を避けようとしています。しかしこの場合、リファクタリングgetProductNameメソッドは、このメソッドを使用する他の場所に影響を与えます。だから私はそれをそのまま残したいと思う。しかし、パフォーマンスのコストが目に見える場合は、私はコードを微調整する方がよいでしょう。

+1

両方の呼び出しが同じトランザクションで行われている場合は、そうです。 SQLログを有効にして、自分で調べないのはなぜですか?特にHibernateをよく理解していないときに、どのクエリーが実行されているのかを理解するために、開発中にそれをオンにするのは良い考えです。 –

+0

私はJPAに慣れていません。 SQLクエリがコンソールに表示されるという事実は、オブジェクトがデータベースで再び取り出されるか、それともまだキャッシュされ、実際には実行されないことを意味しますか? – kiedysktos

+0

Hibernateは、SQLクエリーを実行する場合、それらを照会します。 –

答えて

1

はい、エンティティマネージャで有効な第1レベルのキャッシュがあります。 「第1レベルのキャッシュでは、トランザクションごとにCRUD操作が実行され、データベースに送信されたクエリの数が削減されます。

http://www.developer.com/java/using-second-level-caching-in-a-jpa-application.html

ただ、エンティティマネージャに通知することなく、「矛盾する」状態を作成したり、DBへの変更をフラッシュしないようにしてください。

+1

ありがとう、それは素晴らしいリンクです。しかし、私はトランザクションと関係があるのか​​どうかはわかりません。 JPAエンティティは永続コンテキスト・レベルでキャッシュされ、データベース表の特定の行に対して永続コンテキストごとに1つのオブジェクト・インスタンスが存在することが保証されます。このように私は理解していますEntity ManagerはキャッシュされたIDを持つオブジェクトが既に存在することを認識し、再度取得するためにJDBCを注文しません – kiedysktos

関連する問題