2012-03-29 10 views
2

のUPDATEに格納します。これらを確認してください。benchmarks自分でテストしてください。コレクションが読み取り専用のために頻繁に使用される場合Grails。読み取り専用コレクションを変数

ConfigService{ 

    public def countries(){ 
     return Country.findAllBySomeCondition() 
    } 
} 

ConfigService{ 
    private def countries = Country.findAllBySomeCondition() 

    public def countries(){ 
     return countries 
    } 
} 

または使用:

は、私はこのようないくつかのサービスの変数にオブジェクトのコレクションを保存する必要があります。

答えて

2

が異なります。あなたの最初の例では、値がキャッシュされています。これはもう少し効率的ですが、いくつかの国が追加された場合、サービスコールに表示されないことがあります。ただし、2番目の例で.countries()と頻繁に電話すると、パフォーマンスが低下する可能性があります。

最適なオプションは、クエリの所要時間に関するベンチマークを取得し、値を自分自身でキャッシュするのが最善かどうか、または常に最新の状態になるようにすることです。私の提案は、Hibernateがすでにあなたのためにいくつかのキャッシュを処理しているので、2番目の例に固執することです。リストはあなたのアプリを大幅に妨げるほど大きくない可能性があります。

+0

いくつかのベンチマークを作りました。質問ヘッダーに投稿されたリンクを確認してください。 – vogdb

1

@ GrailsGuyの回答があり、私は彼に+1を与えています。

1)あなたの国のリストが変更されない場合は、それらを列挙型に入れてDBを一緒に避けることができます。

2)ユーザーに国を追加/削除/編集できるようにすると、例1のようにリストをキャッシュできますが、ユーザーが国を追加/削除/編集すると強制的にリストをリロードできます。

ConfigService{ 
    private def countries 

    public def countries(){ 
     if(countries == null) { 
      countries = Country.findAllBySomeCondition() 
     } 
     return countries 
    } 
} 

CountryService { 
    def configService 

    def addCountry() { 
     //Do add country stuff 
     configService.countries = null 
    } 
} 

この方法で、国が更新されるまでキャッシュすることができます。 @GrailsGuyのように、Hibernateはこれをある程度あなたのためにやってくれますが。

関連する問題