Когда польза ЦП от наличия кэша 2-го уровня в Hibernate перевешивает первоначальный удар - PullRequest
0 голосов
/ 16 октября 2018

Когда польза ЦП от добавления объекта в кэш объектов Hibernate 2-го уровня перевешивает первоначальное попадание.

В настоящее время я использую Hibernate без кэш-памяти 2-го уровня.Это для приложения, которое обрабатывает музыкальные файлы ( www.jthink.net / songkong ) и использует Hibernate, так что оно может масштабироваться с большим количеством данных, то есть может обрабатывать 100 000 песен с чуть большим объемом памяти, чем 1000 песен.Как только песни обработаны, они не представляют интереса (если пользователь не запускает Undo)

Насколько я понимаю, если я включаю кэш 2-го уровня (для моего класса песни), тогда начальная запись песни вКэш будет использовать больше процессора, чем при записи в базу данных, а дополнительные модификации объекта песни также потребуют больше ресурсов процессора.Но для последующего извлечения песни из Ehcache потребуется меньше ресурсов, чем для извлечения ее из базы данных.

Мои песни обрабатываются папка за папкой и проходят ряд этапов (на разных исполнителях), когда они ставятся в очередь наВ следующем Executor мы просто передадим идентификаторы песни в качестве параметров, в противном случае он будет использовать много памяти, хранящей сами объекты Song.Поэтому, когда конкретная задача фактически выполняется на Executor, первое, что она делает, - извлекает песни для этих идентификаторов.

Таким образом, нет конкретных идентификаторов песен, которые извлекаются тысячи раз, но каждая песня обычно пишетсяот 1 до 4 раз и извлекает 10 раз.Поэтому, если бы у нас был довольно маленький кеш (потому что я хочу держать память кучи под строгим контролем), я бы ожидал, что для первых нескольких папок, которые будут обработаны, их песни будут добавлены в кеш, а затем, когда они завершат песни из новых папок, им понадобятсяместо в кеше.

Но мой вопрос, стоит ли это того?

Как показывает опыт, 10 операций поиска по сравнению с 1-4 записями имеют смысл использовать кэш 2-го уровня илиполезно только если соотношение больше похоже на 100: 1?

1 Ответ

0 голосов
/ 31 октября 2018

Реальный ответ: Просто сравните его.

Запись в кэш-память кучи не так уж дорога.Так что да, даже получение одного раза из кеша сделает его быстрее, чем возврат к базе данных.

Затем кеш выполняет в основном две вещи поверх HashMap.Он выселяет и истекает.

Выселение означает, что вы установили максимальный размер кеша.Когда это будет достигнуто, кеш вытеснит «самую старую» запись, чтобы добавить новую.Есть несколько определений для самых старых.Ehcache выполняет выборку из набора записей и извлекает запись, к которой не обращались в течение самого длительного времени в выборке.

Истечение срока действия означает, что данная запись в какой-то момент будет считаться устаревшей.Например, вы хотите сохранить запись за 1 час до обновления записи самой последней в базе данных.Когда вы получаете запись, Ehcache сначала смотрит, истек ли срок действия записи.Если это так, он вернет ноль и удалит запись из кэша.Это означает, что просроченная запись будет оставаться в кэше, пока вы не попытаетесь получить к ней доступ.

В вашем случае вы захотите загрузить запись один раз.Тогда имейте это в кеше.Используйте его и, наконец, удалите, чтобы сохранить память.Если у вас есть последний шаг, на котором вы знаете, что запись вам больше не понадобится, просто удалите ее там.

Если вы этого не сделаете, вам придется полагаться на выселение.Поскольку алгоритм вытеснения сначала удалит просроченные записи (зачем удалять совершенно правильную запись, если вы можете удалить просроченную?).

Вы должны рассчитать, сколько раз запись должна оставаться в кэше, чтобы пройти через всех исполнителей.Это будет ваше время истечения (TTL).Затем вы увеличиваете размер кэша более или менее до NB_EXECUTORS * NB_STEPS.Тогда это будет размер используемых в настоящее время песен.При добавлении новой песни в кеш нужно будет удалить старую запись.В большинстве случаев срок действия этой записи истечет, поэтому никакого вреда не будет.

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

Наконец, вы можете захотеть кэшировать песню напрямую, а не использовать Hibernate уровня 2. Потому что это потребует меньшеоперация, чтобы получить песню.Кроме того, при записи записи, которая была в кеше второго уровня, Hibernate, как правило, выселяется из кеша.Убедитесь, что вы настроили его на НЕ .

Примечание о модификации.По умолчанию кэш-память Ehcache (и только кэш-память в куче) указана для каждой ссылки.Поэтому, если вы извлекаете объект Song из кэша, а затем изменяете его, запись в кэше также изменяется, поскольку на самом деле это единственный экземпляр.

Однако это не так, как работает кэш второго уровня Hibernate.Они будут хранить в кэше какую-то строку базы данных.Это будет преобразовано в композицию и возвращено вам.

Когда вы сохраняете композицию в базе данных, Hibernate извлечет ее из кэша, как я говорил выше (но вы можете запросить обновление кэша в конфигурацииЯ не уверен в этом).

Вот почему я думаю, что вы должны кешировать напрямую, а не использовать кеш второго уровня.Однако, будьте осторожны, потому что вы получаете объект, загруженный Hibernate.Вам нужно отсоединить его от Hibernate, прежде чем помещать в кеш.А затем прикрепите его в новом исполнителе.В противном случае, если у вас есть коллекции, например, могут произойти странные вещи.

Теперь, при условии, что вы хотите обновлять кэш и базу данных каждый раз.У вас есть два способа сделать это.

С помощью Cache-aside вы обновите БД, а затем обновите кеш.

С помощью Cache-through вы обновите кеш, который позаботится (атомарно) обновления БД.Кэширование немного сложнее, так как вам нужно обеспечить реализацию CacheLoaderWriter.Но он гарантирует, что кэш и база данных всегда синхронизированы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...