11

Spring MVC Web アプリケーションでデータをキャッシュしたいと考えています。私は Spring Framework と MVC アーキテクチャも初めてなので、( Spring Caching systemを介して) データを 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 レイヤーでキャッシュを行う必要がありますか?

4

2 に答える 2

7

まず、物事を先取りしないでください。キャッシュする前に、それが必要であることを確認してください。キャッシングはパフォーマンスを向上させますが、さまざまな問題を引き起こします (主にデータの一貫性が失われるため)。

次に、キャッシュを行う場合は、可能であれば EHCache などのサードパーティ フレームワークを使用します (はい、それはデータ レイヤーです)。

第三に、あなたの例では、あなたのメソッド署名は、同じリクエストを何度も受け取る可能性は低いと私に思わせます. への回答を保存しても、 へgetOrderCount(January 27, January 28, String)のリクエストを受け取ったときに役に立ちませんgetOrderCount(March 21, March 28, Vector)。ビジネス ロジックで多くのリクエストが発生する可能性が高い何らかの値があり、結果の計算が十分に重い場合を除き、キャッシュ (存在する場合) はデータ レイヤーに移動する必要があります。

于 2013-03-14T21:29:57.673 に答える
3

よりコンテキストを意識したキャッシングを行っている場合、キャッシングはサービス層に収まると思います。たとえば、Web サービス API または Etag サポートによってページングできるクエリ結果の楽観的ロックのサポートなどです。これは、EhCache を直接使用するなどの直接キャッシュ アプローチ (宣言的ではない) を想定しています。

Spring 宣言型キャッシュを使用して包括的なパフォーマンスの改善を試みている場合、DAO レイヤーでメソッドをキャッシュすると便利な場合があります。これが、ORM で既に実装されている可能性のあるキャッシュよりもメリットがあるかどうかはわかりません。たとえば、休止状態は、データベースのパフォーマンスを向上させるためにさまざまなキャッシュレベルをサポートしています。

于 2013-04-02T19:14:15.777 に答える