Grailsの読み取り専用レベルのキャッシュHibernate戦略を一時的に無効にする方法は?
-
19-09-2019 - |
質問
私のGrailsアプリケーションでは、私のドメインクラスの一部がユーザーによって変更されることはありません。
ただし、いくつかのメンテナンス作業が必要な場合があり、管理者は時々いくつかのインスタンスを作成/編集できる必要があります(年に2回としましょう)。
これらのドメインクラスに読み取り専用の第2レベルキャッシュ戦略を設定したいと思います(static mapping = { cache usage: 'read-only' }
)そして、私は、Grails足場編集ビューを介していくつかのインスタンスを育てるために、読み取り専用戦略を(非常に特定の状況で)「無効」できるようにしたいと思います。
出来ますか?あなたは私に何をすることをアドバイスしますか?
編集: :私が実装しているソリューションは、PascalとBurtの回答の組み合わせです(コメントを参照)。どちらの答えも素晴らしく、役に立ちます。それで、私は受け入れられた答えを選ぶためにジレムナを手に入れました!とにかくありがとうございました。
解決
それはおそらく可能ですが、おそらく自明ではありません。 groovy.sql.sqlを使用して直接インサートを使用します。検証を失いますが、インスタンスを作成して検証することはできますが、save()を呼び出すことはできません。次に、SQL挿入が問題ない場合は、
def thing = new Thing(params)
if (thing.validate()) {
new Sql(dataSource).executeInsert(
"insert into thing(name) values(?)", [params.name])
}
else {
// report validation error
}
他のヒント
私は、指定されたエンティティの更新を使用して実行します 純粋なSQL そして、必要なものにします evict()
メソッド呼び出し SessionFactory
2番目のレベルのキャッシュから特定のエンティティを削除します。コレクションからエンティティを削除する必要がある場合があることに注意してください evictCollection()
. 。これをチェックして 素敵なブログ投稿 立ち退きの詳細については。
これらすべてをサービスにカプセル化します(例: wipeBooksFromGlobalCache()
)管理者は、あなたが言及している非常に特定の状況で呼び出すことができます。