2013-03-14 13 views
5

Spring MVC Webアプリケーションでデータをキャッシュしたいと思います。私はSpring FrameworkとMVCアーキテクチャの新機能も持っているので、DAOレイヤーにデータをキャッシュする必要があるかどうかを質問したいと思います(サービスレイヤーにouputメソッドをキャッシュする必要がありますか?Spring MVC WebアプリケーションのDAOレイヤーまたはサービスレイヤーにキャッシュする必要がありますか?

など。私は、サービス層の上に、このメソッドがあります。

@Override 
public LinkedList<OrderCount> getOrderCount(Date dateFrom, Date dateTo, Class type) { 
    try { 
     return chartDataDAO.getOrderCount(dateFrom, dateTo, type); 
    } catch (Exception e) { 
     throw new RuntimeException(e); 
    } 
} 

をし、この方法は、このDAOメソッドを呼び出します:

public LinkedList<OrderCount> getOrderCount(Date dateFrom, Date dateTo, Class type); 

私の質問は:は私がサービスやDAO層の上にキャッシングを行う必要がありますか?

+0

これは「ベストプラクティス」タイプの質問のほうが多いので、私はcodereview.stackexchange.comまたはprogrammers.stackexchange.comに投稿することをお勧めします。どちらももっと自由な議論の場です「適切に形成された」コードとアーキテクチャを構成します。 :)あなたがここで答えを得てうれしい! –

答えて

6

まず、先に進まないでください。キャッシングする前に、必要なことを確認してください。キャッシュはパフォーマンスを向上させることができますが、(データの一貫性を失うために)頭痛の全範囲が導入されます。あなたはキャッシュ、EHCacheなどなどのような使用の可能性、サードパーティのフレームワーク(はいそれは、データ層である)

サードをすれば

第二には、あなたの例では、あなたのメソッドのシグネチャは、私はそれはあなたとは考えにくいと思わせます何回も同じリクエストを受け取ります。 getOrderCount(January 27, January 28, String)への回答を保存することは、getOrderCount(March 21, March 28, Vector)のリクエストを受け取ったときには役に立ちません。 bussinessロジックが多く要求され、結果の計算が十分に重視される価値がある場合を除き、キャッシング(ある場合)はデータレイヤーに移動する必要があります。

3

私は、より多くのコンテキストを意識したキャッシングを行っているなら、サービス層にキャッシングが適合すると思います。たとえば、WebサービスapiまたはEtagサポートによってページングされる問合せ結果のオプティミスティック・ロックのサポート。これは、EhCacheを直接使用するなど、直接的なキャッシュアプ​​ローチ(宣言的ではない)を前提としています。

ブランディングパフォーマンスの向上を試みるためにSpring宣言キャッシングを使用している場合は、DAOレイヤーにメソッドをキャッシュすると便利です。あなたのORMですでに実装されているかもしれないキャッシングよりも利益があるかどうかは分かりません。例えば、データベースのパフォーマンスを向上させるために様々なキャッシュレベルをサポートしています。

関連する問題