1

私は最近JSF2.0アプリケーションの構築を開始し、誰かが私が持っていたアイデアを手伝ってくれるかどうかを考えていました。

頻繁に変更されないことがわかっているオブジェクトのリスト(ルックアップテーブルから取得)があります(たとえば、国のリスト)。国は、それほど頻繁には変更されないリストの単純な例ですが、そのリストは、たとえば2週間ごとに変更されるオブジェクトである可能性があります。

セッションスコープのBeanで私が通常行うことは、データベースからそのリストをロードすることです。

今私の質問はこれです:一定期間後に期限切れになるキャッシュにそのようなリスト(またはもちろんリスト)を保持し、期限切れ後にこのリストをリロードする方法はありますか?うまくいけば、誰かが同じ「問題」に直面し、彼の経験を共有することができたでしょう!

前もって感謝します!

4

1 に答える 1

4

UIレイヤーではなく、ehcacheを使用してルックアップメソッドをキャッシュします。Hibernateを使用する場合は、その第2レベルのキャッシュを使用できます(クエリキャッシュも探してください)。Springを使用する場合は、次のようにサービスメソッドに簡単に注釈を付けることができます。

@Cacheable("countries")
public List<Country> findCountries(){
    // ... your lookup code here....
}

国が更新されたときにキャッシュを無効にすることもできます。

@CacheEvict(value = "countries", allEntries=true)
public void saveCountry(Country country){
    // your code for saving a country
}

そして最後に、ehcache.xmlで、キャッシュのライブ時間(timeToLiveSeconds)を定義できます。変更をサービスファサードからのみ適用できることが確実な場合は、無効にしないように定義することもできます(eternal = true)。

<cache name="countries" maxElementsInMemory="1000" eternal="false" timeToIdleSeconds="120" timeToLiveSeconds="120"/>

アップデート1:

したがって、バッキングBean自体は、スコープを要求または表示することもできます。

@ManagedBean
@ViewScoped
public class Bean{

    @Inject
    private CountryService countryService;

    public List<Country> getCountries(){
        return countryService.findCountries();
    }

}
于 2012-09-14T21:12:46.370 に答える