Связь Ehcache и CacheWriter (отложенная запись)

Предположим, у нас есть Cache, настроенный с CacheWriter с отложенной записью. Предположим, мы поместили какой-то объект в кеш, а позже этот объект был удален из-за политики вытеснения.

Что гарантируется в отношении письма? Точнее, гарантированно ли произойдет write() событие для этого объекта, даже если он был удален до того, как "имеет шанс" быть записанным?

Спасибо!


person yaseco    schedule 22.07.2019    source источник


Ответы (1)


Нет, write() не гарантируется. В случае с отложенной записью все записи хранятся в очереди, в то время как некоторые фоновые потоки читают из этой очереди для обновления базовой SoR (системы записей, т. е. вашей базы данных). Эта очередь может быть прочитана или изменена другими потоками, одновременно читающими или изменяющими тот же кеш.

Например, если для определенного ключа происходит put(), write() ставит команду в очередь. Если до того, как один из фоновых потоков имел возможность использовать команду записи до того, как remove() произойдет с тем же ключом, команда записи может быть удалена из очереди (обратите внимание на «can» здесь). Существуют и другие подобные оптимизации, которые могут иметь место (снова «может»), они могут меняться, а новые могут быть добавлены в любую второстепенную версию, поскольку все это считается деталями реализации, пока данные, обслуживаемые Ehcache, соответствуют его общей видимости. гарантии.

Это означает, что Write-Behind и вообще все CacheWriter не должны использоваться для какой-либо формы учета, если вы имели в виду такой вариант использования.

person Ludovic Orban    schedule 24.07.2019
comment
Я все еще могу прослушивать событие удаления, верно? Моя конечная цель - синхронизировать все данные (в конечном итоге) с БД. Я не против того, что БД не синхронизируется с кешем сразу, но терять данные не хочется. - person yaseco; 25.07.2019
comment
Если вы хотите синхронизировать кэш с БД, просто реализуйте CacheLoaderWriter и позвольте Ehcache сделать все остальное, так как он гарантирует, что данные будут записаны в базу данных. То есть, конечно, исключая любой сбой JVM с Ehcache. Если вы не работаете в кластере. - person Ludovic Orban; 26.07.2019
comment
Да, именно это я и сделал (Реализация CacheLoaderWriter). Я, наверное, запутал вас, написав CacheWriter (?) - person yaseco; 28.07.2019
comment
Что мне сейчас не ясно, так это то, как эти два утверждения существуют вместе: (1) Это означает отложенную запись и, в более общем смысле, все CacheWriters не должны использоваться для какой-либо формы учета (2), поскольку это гарантирует, что данные будут прекращены. записывается в базу данных. Не могли бы вы уточнить это? - person yaseco; 28.07.2019
comment
Я предполагаю, что это означает, что (1) данные могут быть потеряны. (2) кеш может не соответствовать БД. Поэтому не используйте это решение, если вы реализуете что-то, что должно быть транзакционным (например, операции с банковскими счетами). - person yaseco; 28.07.2019
comment
Ре. (1) данные не могут быть потеряны до тех пор, пока не произойдет сбой JVM, на котором запущен кэш с отложенной записью, или пока кластер исправен, если вы работаете в кластере. Ре. (2) вы правы: всегда будет задержка между записью некоторых данных в Ehcache и моментом их попадания в SoR. Это хорошо известный компромисс использования отложенной записи: когда-либо получать доступ к своим данным только через кеш или рисковать чтением устаревшего SoR. - person Ludovic Orban; 01.08.2019