Реальный ответ: Просто сравните его.
Запись в кэш-память кучи не так уж дорога.Так что да, даже получение одного раза из кеша сделает его быстрее, чем возврат к базе данных.
Затем кеш выполняет в основном две вещи поверх HashMap.Он выселяет и истекает.
Выселение означает, что вы установили максимальный размер кеша.Когда это будет достигнуто, кеш вытеснит «самую старую» запись, чтобы добавить новую.Есть несколько определений для самых старых.Ehcache выполняет выборку из набора записей и извлекает запись, к которой не обращались в течение самого длительного времени в выборке.
Истечение срока действия означает, что данная запись в какой-то момент будет считаться устаревшей.Например, вы хотите сохранить запись за 1 час до обновления записи самой последней в базе данных.Когда вы получаете запись, Ehcache сначала смотрит, истек ли срок действия записи.Если это так, он вернет ноль и удалит запись из кэша.Это означает, что просроченная запись будет оставаться в кэше, пока вы не попытаетесь получить к ней доступ.
В вашем случае вы захотите загрузить запись один раз.Тогда имейте это в кеше.Используйте его и, наконец, удалите, чтобы сохранить память.Если у вас есть последний шаг, на котором вы знаете, что запись вам больше не понадобится, просто удалите ее там.
Если вы этого не сделаете, вам придется полагаться на выселение.Поскольку алгоритм вытеснения сначала удалит просроченные записи (зачем удалять совершенно правильную запись, если вы можете удалить просроченную?).
Вы должны рассчитать, сколько раз запись должна оставаться в кэше, чтобы пройти через всех исполнителей.Это будет ваше время истечения (TTL).Затем вы увеличиваете размер кэша более или менее до NB_EXECUTORS * NB_STEPS
.Тогда это будет размер используемых в настоящее время песен.При добавлении новой песни в кеш нужно будет удалить старую запись.В большинстве случаев срок действия этой записи истечет, поэтому никакого вреда не будет.
Чтобы предотвратить выселение (которое может оказаться дорогостоящим, если не найдено запись с истекшим сроком действия), вы можете кодировать фоновую процедуру, которая получает записи.Это вызовет истечение срока.Но опять же, не делайте этого, прежде чем быть уверенным, используя эталонный тест, что он на самом деле быстрее.
Наконец, вы можете захотеть кэшировать песню напрямую, а не использовать Hibernate уровня 2. Потому что это потребует меньшеоперация, чтобы получить песню.Кроме того, при записи записи, которая была в кеше второго уровня, Hibernate, как правило, выселяется из кеша.Убедитесь, что вы настроили его на НЕ .
Примечание о модификации.По умолчанию кэш-память Ehcache (и только кэш-память в куче) указана для каждой ссылки.Поэтому, если вы извлекаете объект Song из кэша, а затем изменяете его, запись в кэше также изменяется, поскольку на самом деле это единственный экземпляр.
Однако это не так, как работает кэш второго уровня Hibernate.Они будут хранить в кэше какую-то строку базы данных.Это будет преобразовано в композицию и возвращено вам.
Когда вы сохраняете композицию в базе данных, Hibernate извлечет ее из кэша, как я говорил выше (но вы можете запросить обновление кэша в конфигурацииЯ не уверен в этом).
Вот почему я думаю, что вы должны кешировать напрямую, а не использовать кеш второго уровня.Однако, будьте осторожны, потому что вы получаете объект, загруженный Hibernate.Вам нужно отсоединить его от Hibernate, прежде чем помещать в кеш.А затем прикрепите его в новом исполнителе.В противном случае, если у вас есть коллекции, например, могут произойти странные вещи.
Теперь, при условии, что вы хотите обновлять кэш и базу данных каждый раз.У вас есть два способа сделать это.
С помощью Cache-aside вы обновите БД, а затем обновите кеш.
С помощью Cache-through вы обновите кеш, который позаботится (атомарно) обновления БД.Кэширование немного сложнее, так как вам нужно обеспечить реализацию CacheLoaderWriter
.Но он гарантирует, что кэш и база данных всегда синхронизированы.