Статьи

Ehcache 2.5 выходит на бета-версию! (объяснение включено)

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

Ehcache как Hibernate кеш

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

Все началось с кеша по умолчанию

<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd">
  <defaultCache
     eternal="false"
     overflowToDisk="true"
     maxElementsInMemory="10000"/>
</ehcache>

Эта простая конфигурация ehcache.xml указывает Ehcache определить все кэши, следуя конфигурации по умолчанию. Здесь у нас есть кэши, которые будут содержать не более 10000 элементов.

Давайте применим этот кеш в Hibernate

Пока что вы, вероятно, знакомы с этой частью, мы определяем ehcache как кеш для hibernate, просто добавив следующий параметр в конфигурацию hibernate:

hibernate.cache.region.factory_class=net.sf.ehcache.hibernate.EhCacheRegionFactory

Давайте представим два примера объектов:  Страна и Город
В мире около 200 стран, поэтому довольно просто оптимизировать кэш, связанный со страной.

<cache name="com.jsoft.tutorial.domain.Country"
       eternal="false"
       overflowToDisk="true"
       maxElementsInMemory="200"/>

 

Но как насчет городского образования? Очевидно, что городов может быть так много, что мы будем хранить в кэше лишь подмножество всех существующих объектов.
Мы можем положиться на кэш по умолчанию и сохранить максимум 10000 объектов City в кэше, или настроить кэш и установить другое число.

<cache name="com.jsoft.tutorial.domain.City"
       eternal="false"
       overflowToDisk="true"
       maxElementsInMemory="50000"/>

Мы видим, что выбрать максимальное количество элементов в кеше в памяти становится все труднее.
И есть еще один вопрос, сколько памяти мы можем выделить кешу для эффективности?
Давайте возьмем гипотезу, согласно которой 1 элемент City занимает около 1 КБ памяти. Удержание 50000 элементов займет около 50 МБ памяти.

Но использование большого количества памяти может стать проблемой в Java. При использовании более 4 ГБ оперативной памяти сборщик мусора может вызывать длительные паузы и останавливать ваше приложение. Таким образом, чтобы иметь эффективное приложение, мы должны стараться не использовать более 4 ГБ памяти. (Мы также можем использовать BigMemory с Ehcache , но это другая история).

В нашей гипотезе, если наше приложение использует 2 ГБ памяти, мы могли бы безопасно выделить по крайней мере 1 ГБ для нашего набора кэшей, и 50 МБ для нашего кэша City было бы в порядке, для других кэшей останется достаточно памяти.

Мы по-прежнему сталкиваемся с двумя трудностями:
— возможно, мы захотим добавить больше элементов в кэш, чтобы наше приложение могло масштабироваться лучше, но нам нужно настроить себя на это ограничение.
— если наш объект City изменится и получит больше атрибутов, его размер в памяти также изменится, и наш кэш будет занимать больше памяти. Это то, что нам нужно отслеживать и обновлять.

Тюнинг — это много работы, поэтому давайте не будем этого делать сами.

Много раз я видел корпоративные приложения, использующие ehcache и вообще не имеющие настройки. Он по-прежнему работал нормально, потому что ehcache — стабильный и зрелый продукт, но эти приложения могли бы быть лучше оптимизированы с небольшой настройкой (не только на Ehcache).

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

Вот где Ehcache 2.5 приходит на помощь!

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

Конфигурация проста , минимум — определить общее количество памяти, которое вы выделите для всего набора кэшей, это делается в теге <ehcache>

<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd"
        maxBytesLocalHeap="300m">
...
</ehcache>

Благодаря этому Ehcache будет управлять памятью, а ваши кеши будут динамически получать то, что доступно.

Давайте применим это к нашей предыдущей конфигурации

<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd"
        maxBytesLocalHeap="300m">

   <defaultCache
    eternal="true"
    overflowToDisk="true"/>

  <cache eternal="false" name="com.jsoft.tutorial.Country" overflowToDisk="true"/>

  <cache eternal="false" name="com.jsoft.tutorial.City" overflowToDisk="true"/>

</ehcache>

Здесь тайники будут заполняться до тех пор, пока 300 метров не будут полностью использованы. И что лучше всего, размеры кэшей могут изменяться динамически . Например, если в кеше Country использовалось 200 м, в кэше City могло бы использоваться 100 м. Но давайте представим, что через 30 минут некоторые элементы в кеше Country были выселены, и кеш теперь использует только 150 м, недавно освобожденные 50 м могут использоваться кешем City для хранения большего количества элементов.

Самонастройка — это здорово, но я хочу НЕКОТОРЫЙ контроль!

Давайте посмотрим, как мы можем улучшить самонастраивающееся поведение Ehcache.
По умолчанию кеш будет использовать то, что доступно в общей памяти

Но это также можно выделить фиксированный размер памяти в кэш, используя maxLocalBytesOnheap атрибут на <кэш> тега

например

<cache eternal="false" name="com.jsoft.tutorial.Country" overflowToDisk="true" maxLocalBytesOnheap="10m"/>

Мы можем даже дать% от общей доступной памяти:
например,

<cache eternal="false" name="com.jsoft.tutorial.Country" overflowToDisk="true" maxLocalBytesOnheap="20%"/>

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

Здесь больше, чем память …

Я говорил о настройке памяти, но Ehcache не ограничивается использованием кучи памяти, он имеет многоуровневую архитектуру .
Ehcache использует трехуровневую архитектуру для хранения элементов.
Впереди у вас будет куча памяти, самая быстрая, но подверженная проблеме с паузами сборщика мусора.
Тогда вне памяти , которая все еще памяти, но не в куче. Это медленнее, но это не сборщик мусора, так что нет проблем, вы можете использовать сотни гигабайт памяти.
Последний уровень находится на диске , он самый медленный, но все же быстрее, чем доступ к базе данных, и он может быть огромным, поскольку он ограничен только размером вашего диска.

Используя эти уровни, вы можете кэшировать сотни гигабайт данных и масштабировать свое приложение без изменения его архитектуры. Вы сами решаете, сколько данных вы хотите кэшировать, решая, какие уровни вы хотите использовать (Heap всегда впереди, offheap и disk не обязательны).

Функция самонастройки Ehcache доступна для каждого уровня со следующими параметрами: maxBytesLocalHeap , maxBytesLocalOffHeap и maxBytesLocalDisk .

Просто помните, что в текущей бета-версии, если вы хотите использовать offheap, вам нужно будет добавить overflowToOffHeap = «true» , а если вы хотите использовать диск, вам нужно будет добавить overflowToDisk = «true» .

Полная конфигурация будет выглядеть так:

<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd"
        maxBytesLocalHeap="60m"
        maxBytesLocalOffHeap="300m"
        maxBytesLocalDisk="500m">

  <defaultCache
    eternal="true"
    overflowToDisk="true"/>

  <cache eternal="false" name="com.jsoft.tutorial.Country" overflowToDisk="true"/>

  <cache eternal="false" name="com.jsoft.tutorial.City"
       maxBytesLocalOffHeap="10m"
       overflowToOffHeap="true"
       maxBytesLocalHeap="15%"
       overflowToDisk="true"
       maxBytesLocalDisk="300m"/>

</ehcache>

Это не останавливаться на достигнутом

Ehcache 2.5 имеет гораздо больше улучшений. Один из них закреплен.
Например, в моем примере было бы неплохо сохранить некоторые объекты в памяти, несмотря ни на что.
Давайте посмотрим на сущность Country, мы знаем, что это ограниченный набор, и мы можем предположить, что эти сущности используются регулярно, поэтому было бы хорошо заставить их оставаться в кэше. Вот где мы можем воспользоваться закреплением кэша.

Мы настроим это так:

<cache eternal="false" name="com.jsoft.tutorial.Country" overflowToDisk="true">
  <pinning store="localHeap"/>
</cache>

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

Время сделать паузу

Сейчас я остановлюсь, но в Ehcache 2.5 появилось больше новых функций, таких как разогрев кеша, copyOnRead, copyOnWrite … В официальной документации есть много интересного .

Также обратите внимание, что я говорил здесь об Ehcache, когда он используется в качестве кэша 2-го уровня для Hibernate, но эти новые функции также применимы к Ehcache как к автономному решению для кэширования вашего приложения.

Спасибо за чтение!

От http://jsoftbiz.wordpress.com/2011/08/01/ehcache-2-5-goes-beta-explanation-included/