Echache 3.2.0 未发现 Store.Provider 处理配置的资源类型 [offheap, disk] 异常
Echache 3.2.0 No Store.Provider found to handle configured resource types [offheap, disk] exception
我最近从较旧的 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>
使用上面显示的配置我得到以下异常跟踪,我将其截断以保留一点 space 但清楚地显示错误:
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 文档,您可以使用数据存储层的任意组合,但显然情况并非如此,因为上述错误 shows.So...
- 如果我注释掉
offheap 资源,只保留 磁盘,但不能同时保留两者。这是正常的吗?我错过了什么?
- 根据 2.7.8 版本,文档(参见此处 ehcache-2.8-storage-options)提到 BigMemory 作为 offHeap 存储,但是,在 ehcache-3.2 中。0.jar 如果我没看错的话,有一些-一种用于此目的的内部地图。上面报告的错误是否与我没有在项目中包含 BigMemory 这一事实有关?我的猜测是否定的,但如果有人能澄清一下就好了?
如有任何帮助,我们将不胜感激。提前致谢。
简而言之,目前不支持具有 仅 堆外层的磁盘层。当前的 Ehcache 3.x 对分层的支持要求在您想要多个层时使用 heap 层。
目前支持的组合(Ehcache 3.1.x及以上):
- 堆或堆外或磁盘或集群(单层)
- 堆 + 堆外
- 堆+磁盘
- 堆+堆外+磁盘
- 堆+集群
- 堆+堆外+集群
该错误与 BigMemory
无关,后者是基于 Ehcache 2.x 的商业产品。
问题是更高的缓存级别(当前是堆外)需要是一个缓存层(我们对近缓存的术语)。现在,offheap 不是。因此,一旦开始拥有层,就需要堆上级别。这是一个工作配置。
我还将 ehcache
设置为默认命名空间,以使 xml 更具可读性。并将 defaultThreadPool
设置为默认值以防止您必须在任何地方设置它(替代方法是添加 <event-dispatch thread-pool="defaultDiskPool"/>
因为 event-dispatch 需要一个线程池并且没有默认值)。
<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>
我最近从较旧的 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>
使用上面显示的配置我得到以下异常跟踪,我将其截断以保留一点 space 但清楚地显示错误:
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 文档,您可以使用数据存储层的任意组合,但显然情况并非如此,因为上述错误 shows.So...
- 如果我注释掉 offheap 资源,只保留 磁盘,但不能同时保留两者。这是正常的吗?我错过了什么?
- 根据 2.7.8 版本,文档(参见此处 ehcache-2.8-storage-options)提到 BigMemory 作为 offHeap 存储,但是,在 ehcache-3.2 中。0.jar 如果我没看错的话,有一些-一种用于此目的的内部地图。上面报告的错误是否与我没有在项目中包含 BigMemory 这一事实有关?我的猜测是否定的,但如果有人能澄清一下就好了?
如有任何帮助,我们将不胜感激。提前致谢。
简而言之,目前不支持具有 仅 堆外层的磁盘层。当前的 Ehcache 3.x 对分层的支持要求在您想要多个层时使用 heap 层。
目前支持的组合(Ehcache 3.1.x及以上):
- 堆或堆外或磁盘或集群(单层)
- 堆 + 堆外
- 堆+磁盘
- 堆+堆外+磁盘
- 堆+集群
- 堆+堆外+集群
该错误与 BigMemory
无关,后者是基于 Ehcache 2.x 的商业产品。
问题是更高的缓存级别(当前是堆外)需要是一个缓存层(我们对近缓存的术语)。现在,offheap 不是。因此,一旦开始拥有层,就需要堆上级别。这是一个工作配置。
我还将 ehcache
设置为默认命名空间,以使 xml 更具可读性。并将 defaultThreadPool
设置为默认值以防止您必须在任何地方设置它(替代方法是添加 <event-dispatch thread-pool="defaultDiskPool"/>
因为 event-dispatch 需要一个线程池并且没有默认值)。
<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>