我试图设置一个EHCache,用于在同一个Tomcat实例上运行的各种WAR文件。
我正在缓存的对象是自定义java bean。我正在使用EHCache版本2.8.3
理想情况下,我只想在Tomcat公共类加载器中共享ehcache JAR,并且我已经阅读过这应该是可能的。
我正在进行的测试有两个Web服务,ServiceA和ServiceB,它们使用相同的缓存,因为EHCache JAR位于Tomcat common lib文件夹中。
当我使用ServiceA发出请求时,生成的对象已成功插入到缓存中。
当我使用ServiceB发出相同的请求时,会从缓存中成功检索生成的对象。
但是,当我返回ServiceA并发出请求时,它会抛出ClassCastException
<faultcode>S:Server</faultcode>
<faultstring>com.company.platform.auth.user.AuthenticatedUser cannot be cast to com.company.platform.auth.user.AuthenticatedUser</faultstring>
EHCache文档建议我应将copyOnRead属性设置为true,以确保缓存始终使用序列化。但是,添加此内容对我来说似乎没有用
http://terracotta.org/documentation/3.7.4/enterprise-ehcache/configuration-guide#copy-on-read
缓存配置:
<cache name="myCache"
maxElementsInMemory="2000"
copyOnRead="true"
copyOnWrite="true"
eternal="false"
overflowToDisk="false"
timeToIdleSeconds="0"
timeToLiveSeconds="3600"
memoryStoreEvictionPolicy="LFU"
transactionalMode="off"
/>
使用方法上的Spring @Cacheable注释来管理缓存数据:
@Cacheable(
value=CACHE_NAME,
key="#username + ':' + T(com.company.platform.auth.handlers.EncryptionHandler).encrypt(#password)",
unless="#result == null")
public AuthenticatedUser authenticate(String username, String password) {