У меня довольно стандартная настройка уровня сохранения в приложении Spring с использованием Hibernate (4.2.15.Final) с EhCache (2.6.9) в качестве кэша второго уровня.EhCache Hibernate кэш второго уровня maxBytesLocalHeap slow
Все работает должным образом. Однако ввод записей в кеш второго уровня иногда занимает много времени.
Я настроил кэширование моей модели домена классов в явном ehcache.xml
файл (я не настроить кэш по умолчанию):
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd"
name="hibernate"
updateCheck="false"
monitoring="autodetect"
dynamicConfig="false"
maxBytesLocalHeap="300M"
maxBytesLocalDisk="500M">
<cache
name="org.mycorp.model.MyEntity"
eternal="true"
overflowToDisk="false"
diskPersistent="false"
maxBytesLocalHeap="5M" />
...
</ehcache>
Я получаю следующее сообщение INFO регистрируется при запуске контекста инерционности :
DefaultSizeOfEngine | using Agent sizeof engine
и следующее предупреждение во время выполнения
ObjectGraphWalker | The configured limit of 1,000 object references was reached while attempting to calculate the size of the object graph. Severe performance degradation could occur if the sizing operation continues. [...]
AFAIK ObjectGraphWalker
должен оценивать объекты, помещенные в кеш, поскольку я сконфигурировал отдельные области кеша с помощью maxBytesLocalHeap
.
Моя модель предметной области является довольно сложным, и я знаю, что я могу ограничить ходьбу графа с @IgnoreSizeOf
аннотаций, но я не зная, как решить эту проблему:
- Должен ли я игнорировать одну сторону двунаправленной ассоциации, чтобы избежать циклов?
- Должен ли я явно игнорировать переходные члены классов модели домена?
- В целом, разумно ли идти с
maxBytesLocalHeap
при использовании EhCache вместе с Hibernate, или мне нужно установить дляmaxEntriesLocalHeap
, потому что Hibernate сохраняет отдельную область кэша для каждого объекта?
[UPDATE]: Я обнаружил, что временные члены не будут кэшировать Hibernate (см Hibernate: Is it possible to save a transient field in second level cache?), поэтому они не должны быть расценены Ehcache в любом случае. Верный?
Я исследовал эту статью, и наша проблема не была связана вообще с Hibernate; на самом деле ehcache 2.10.3 и, возможно, более ранние версии имеют предварительно сконфигурированный фильтр, который кажется правильным ('ehcache-2.10.3.jar!/net/sf/ehcache/pool/builtin-sizeof.filter'). Статья интересна тем, что я нашел способ найти, какая запись была добавлена в кэш, включив журнал отладки в 'net.sf.ehcache.pool' и установив' static {System.setProperty ("net.sf.ehcache.sizeof. verboseDebugLogging "," true "); } '. Оказалось, что это сервис, аннотированный Spring '@ Cacheable', который возвращал« ResourceBundle ». – Brice