これは問題のコードです:
public interface WeatherDao {
public Weather getWeather(String zipCode);
public List<Location> findLocations(String locationSearch);
}
public class DefaultWeatherDao implements WeatherDao {
@Cacheable(cacheName="weatherCache")
public Weather getWeather(String zipCode) {
//Some Code
}
@Cacheable(cacheName="locationSearchCache")
public List<Location> findLocations(String locationSearch) {
//Some Code
}
}
static
変数についてのあなたのポイントをよく理解していません。本質的に、からへのマップとからzipCode
へWeather
の類似したマップがあります。このマップは、データベース、ファイル、外部APIなどから取得できます。locationSearch
List<Location>
可能なすべての引数をキーおよび対応する値としてマップを作成しますか?もちろんできますが、いくつかの欠点があります。
ヒープに大きなプレッシャーをかけます。多くの場合、データの量はメモリに収まらない可能性があり、ディスクにも収まらない可能性があります(考えてみてください:すべての可能な検索クエリとヒットのリストを保存することでGoogle検索エンジンをキャッシュします)
ほとんどの場合、ほとんどのキーを使用することはありません。なぜそれらをメモリに保存するのですか?
立ち退きはどうですか?これらのメソッドは、時間の経過とともに同じ郵便番号に対して異なる天気を返す傾向があるに違いありません...
私はあなたの議論を完全には理解していないので、呼び出されたときに舞台裏で何が起こるかを簡単に説明しましょうgetWeather()
:
透過プロキシはgetWeather()
通話を傍受して検索しますweatherCache
そのキャッシュでは、zipCode
引数をキャッシュキーとして使用します
そのようなエントリが存在する場合(タイプWeather
)、すぐに返されます
上記が当てはまらない場合、制御は実際のgetWeather()
メソッドに委任されます。APIを呼び出したり、データベースクエリを実行したり、時間のかかる計算を実行したりできます。
の結果は、将来の参照用にgetWeather()
に配置されます。weatherCache
ここには関係ありませんstatic
。
ところで、Spring 3.1は、おそらくこのGoogleCodeプロジェクトを時代遅れにするキャッシング抽象化レイヤーを導入しました。見た目は同じで、さまざまなキャッシュ実装とのシームレスな統合が可能です。