Как временно отключить доступную только для чтения стратегию спящего режима 2-го уровня в Grails? - PullRequest
2 голосов
/ 10 февраля 2010

В моем приложении grails некоторые классы моего домена никогда не будут изменены пользователями.

Однако иногда требуются некоторые работы по техническому обслуживанию, и администратор должен иметь возможность время от времени создавать / редактировать несколько экземпляров (скажем, два раза в год).

Я хотел бы установить стратегию кэширования 2-го уровня только для чтения для этих классов доменов (static mapping = { cache usage: 'read-only' }) И я хотел бы иметь возможность «отключить» (в определенных ситуациях) стратегию только для чтения, чтобы обновите некоторые экземпляры в режиме редактирования лесов Grails.

Возможно ли это? Что вы мне посоветуете сделать?

РЕДАКТИРОВАТЬ : Решение, которое я реализую, представляет собой смесь ответов Паскаля и Берта (см. Комментарии). Оба ответа великолепны и полезны. Таким образом, я получил дилемму для выбора принятого ответа! В любом случае, благодарю Вас.

Ответы [ 2 ]

3 голосов
/ 11 февраля 2010

Я бы выполнил обновление данных объектов, используя чистый SQL , а затем сделал бы требуемые вызовы evict() метода для SessionFactory, чтобы удалить конкретные объекты из 2-го кеш уровня. Обратите внимание, что вам, возможно, придется удалять сущности из коллекций также с помощью evictCollection(). Проверьте это хороший пост в блоге для деталей о выселении.

Инкапсулируйте все это в сервисах (например, wipeBooksFromGlobalCache()), которые администраторы могут вызывать в очень конкретных ситуациях, о которых вы упоминаете.

3 голосов
/ 11 февраля 2010

Это возможно, но, скорее всего, нетривиально. Я бы пошел с прямыми вставками, используя 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
}
...