Echache 3.2.0 Не найден Store.Provider для обработки настроенных типов ресурсов [offheap, disk] исключение
Я недавно переключился с более старой реализации ehcache на версию 3.2, поэтому у меня есть следующий файл конфигурации xml для проекта:
<eh:config xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'
xmlns:eh='http://www.ehcache.org/v3'
xsi:schemaLocation="http://www.ehcache.org/v3
http://www.ehcache.org/schema/ehcache-core-3.0.xsd">
<eh:persistence directory="C:\foo\bar\Cache-Persistence"/>
<eh:thread-pools>
<eh:thread-pool alias="defaultDiskPool" min-size="1" max-size="3"/>
</eh:thread-pools>
<eh:disk-store thread-pool="defaultDiskPool"/>
<eh:cache-template name="PROC_REQTemplate">
<eh:key-type>java.lang.String</eh:key-type>
<eh:value-type>java.lang.String</eh:value-type>
<eh:expiry>
<eh:ttl>640</eh:ttl>
</eh:expiry>
<eh:resources>
<eh:offheap unit="MB">500</eh:offheap>
<eh:disk unit="GB" persistent="true">3</eh:disk>
</eh:resources>
<eh:disk-store-settings thread-pool="defaultDiskPool"/>
</eh:cache-template>
<eh:cache alias="proc_req_cache" uses-template="PROC_REQTemplate"/>
</eh:config>
с показанной выше конфигурацией я получаю следующую трассировку исключений, которую я усекаю, чтобы сохранить немного места, но ясно показываю ошибку:
java.lang.IllegalStateException: No Store.Provider found to handle configured resource types [offheap, disk] from {org.ehcache.impl.internal.store.heap.OnHeapStore$Provider, org.ehcache.impl.internal.store.tiering.TieredStore$Provider, org.ehcache.impl.internal.store.offheap.OffHeapStore$Provider, org.ehcache.impl.internal.store.disk.OffHeapDiskStore$Provider}
at org.ehcache.core.internal.store.StoreSupport.selectStoreProvider(StoreSupport.java:80) ~[?:?]
at org.ehcache.core.EhcacheManager.getStore(EhcacheManager.java:440) ~[?:?]
at org.ehcache.core.EhcacheManager.createNewEhcache(EhcacheManager.java:311) ~[?:?]
at org.ehcache.core.EhcacheManager.createCache(EhcacheManager.java:260) ~[?:?]
at org.ehcache.core.EhcacheManager.init(EhcacheManager.java:567) ~[?:?]
Я думал, что в соответствии с текущей документацией 3.2 вы можете использовать любую комбинацию уровней хранения данных, но, видимо, это не тот случай, как показывает вышеуказанная ошибка. Так что...
- Я могу только заставить вышеупомянутую конфигурацию hown работать, если я закомментирую ресурс offheap и оставлю только диск, но не оба. Это нормально? что мне не хватает?
- Что касается версии 2.7.8, то в документации (см. Здесь ehcache-2.8-storage-options) упоминается BigMemory как хранилище offHeap, однако в ehcache-3.2.0.jar, если я правильно вижу, есть какая-то внутренняя карта для эта цель. Может ли указанная выше ошибка быть связана с тем, что я не включаю BigMemory в проект? Я думаю, нет, но было бы неплохо, если кто-то может уточнить?
Любая помощь будет принята с благодарностью. Заранее спасибо.
2 ответа
Проблема в том, что более высокий уровень кэширования (в настоящее время вне кэша) должен быть уровнем кэширования (наша терминология для почти кэширования). Прямо сейчас нет. Так что вам нужен уровень onheap, как только у вас появятся слои. Вот рабочая конфигурация.
Я также установил ehcache
в качестве пространства имен по умолчанию, чтобы сделать XML более читабельным. И установить defaultThreadPool
по умолчанию, чтобы вам не приходилось устанавливать его везде (и альтернативой является добавление <event-dispatch thread-pool="defaultDiskPool"/>
потому что для отправки события нужен пул потоков, а по умолчанию не было).
<config xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'
xmlns='http://www.ehcache.org/v3'
xsi:schemaLocation="http://www.ehcache.org/v3
http://www.ehcache.org/schema/ehcache-core-3.0.xsd">
<persistence directory="C:\foo\bar\Cache-Persistence"/>
<thread-pools>
<thread-pool alias="defaultDiskPool" min-size="1" max-size="3" default="true"/>
</thread-pools>
<cache-template name="PROC_REQTemplate">
<key-type>java.lang.String</key-type>
<value-type>java.lang.String</value-type>
<expiry>
<ttl>640</ttl>
</expiry>
<resources>
<heap unit="entries">1</heap>
<offheap unit="MB">500</offheap>
<disk unit="GB" persistent="true">3</disk>
</resources>
</cache-template>
<cache alias="proc_req_cache" uses-template="PROC_REQTemplate"/>
</config>
Короче говоря, в настоящее время нет поддержки наличия уровня диска только с уровнем offheap. Текущая поддержка Ehcache 3.x для многоуровневого уровня требует наличия кучи в тот момент, когда вы хотите иметь несколько уровней.
Поддерживаемая комбинация в этот день (Ehcache 3.1.x и выше):
- куча или внешняя куча или диск или кластер (один уровень)
- куча + вне куча
- куча + диск
- куча + offheap + диск
- куча + кластерный
- куча + offheap + кластеризованный
Ошибка не имеет ничего общего с BigMemory
который был коммерческим предложением поверх Ehcache 2.x.