2012-03-10 17 views
1

私はgrailsアプリケーションでドメインインスタンスとクエリをキャッシュしています。私は最初にクエリがdbに起動された後に、後続の呼び出しはキャッシュをヒットすることを期待します。 しかし、私は定期的に(5〜6回ごとに)dbにヒットしているのを見ています。その間にデータは更新/挿入されません。私はログに記録されているすべてのクエリをチェックアウトするためにp6spyを使用していますし、アップデートや挿入が起こっていないことを確認しています。Grailsがキャッシュを無効にするのはなぜですか?

tweekに追加設定がありますか?

現在のドメインクラスはfindBy*よう

static mapping = { 
cach true 
} 

クエリが[cache:true]セットを持っています。

+1

これは正常です。特定の条件が満たされるとキャッシュが無効になります。キャッシュの設定はehcache設定で設定する必要があります。デフォルトでは、読み込まれたehcache-failsafe設定があります。そして、私はキャッシュがデフォルトで5分後に無効になると思います。 – netbrain

答えて

5

Ehcacheを設定しないと、キャッシュのデフォルトのタイムアウトは120秒になります。コメントのついたサンプルファイルは、Ehcache jarにあるデフォルトファイルと同じです(http://ehcache.org/ehcache.xmlを参照してください)。

アプリケーションにehcache.xmlを作成して、タイムアウト、メモリ内の最大要素、ディスクへのスプーリングの有無などを構成できます。 src/javaに入れてクラスパスにコピーし、Ehcacheはそれを見てデフォルトの代わりにあなたのものを使用します。

+0

休止状態のクエリキャッシュに関する次の投稿(http://tech.puredanger.com/2009/07/10/hibernate-query-cache/)を見つけました。これらの観測はまだ有効です。つまり、クエリキャッシュをすべてオフにする方が良いでしょうか? – Abe

+1

はい、ポイントはすべて有効です。クエリの中にはキャッシュの候補がありますが、特定のドメインクラスのインスタンスを編集、追加、削除する場合は、そのクラスのクエリをキャッシュしないことをお勧めします。読み取り専用ドメインクラスと読み取り専用ドメインクラス、および更新されたドメインクラスのインスタンスとクエリをキャッシュすることは避けることを検討します(ただし、アプリとユースケースによって異なります)。 'grails.hibernate.cache.queries'を' Config.groovy'でfalseに変更し、クエリごとに 'cache:true'を追加することをお勧めします。 –

+0

ありがとう!私はgrails.hibernate.cache.queriesをfalseにすると、クエリをキャッシュできないことを意味する印象を受けました。これをオフにしてから、キャッシュを設定できるという柔軟性は、個々のクエリに対して非常に優れています。 – Abe

関連する問題