我在Google App Engine v1.7.0中以编程方式使用EHCache 2.6.0(没有ehcache.xml)。
当我使用:
实例化CacheManager时CacheManager cacheManager = CacheManager.create();
我收到了错误:
Caused by: java.lang.RuntimeException: java.security.AccessControlException: access denied (java.lang.RuntimePermission accessDeclaredMembers)
at java.util.concurrent.atomic.AtomicReferenceFieldUpdater$AtomicReferenceFieldUpdaterImpl.<init>(AtomicReferenceFieldUpdater.java:217)
at java.util.concurrent.atomic.AtomicRefe...(length 9029)
我试过了:
CacheManager cacheManager = new CacheManager();
并关闭监控:
Configuration configuration = new Configuration();
configuration.setMonitoring(Configuration.Monitoring.OFF.name());
configuration.setUpdateCheck(false);
CacheManager cacheManager = new CacheManager(configuration);
对于他们两个我得到以下错误:
Caused by: java.lang.NoClassDefFoundError: Could not initialize class net.sf.ehcache.util.lang.VicariousThreadLocal
at net.sf.ehcache.TransactionController.<init>(TransactionController.java:43)
at net.sf.ehcache.CacheManager.doInit(CacheManager.java:433)
at net.sf.ehcache.CacheManager.init(CacheManager.java:374)
如何解决这个问题?
答案 0 :(得分:3)
在我看来,Ehcache v2.6与当前的AppEngine不兼容。我不得不切换到以前版本的ehcache来运行它。经过长时间的尝试和错误后,版本2.4.7似乎是稳定的。 '显然'ehcache提供的配置不起作用。以下是我必须配置的方法:
<?xml version="1.0" encoding="UTF-8"?>
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="ehcache.xsd" >
<cacheManagerEventListenerFactory class="" properties=""/>
<defaultCache
maxElementsInMemory="10000"
eternal="false"
overflowToDisk="false"
timeToIdleSeconds="120"
timeToLiveSeconds="120"
memoryStoreEvictionPolicy="LRU">
</defaultCache>
<!--Example sample cache-->
<cache name="sid"
maxElementsInMemory="100"
eternal="false"
timeToIdleSeconds="300"
timeToLiveSeconds="300"
memoryStoreEvictionPolicy="LFU"
/>
</ehcache>
答案 1 :(得分:1)
AppEngine是一个分布式系统,其中请求由多个前端实例自动处理。在这样的设置中,您不能在前端实例上使用缓存实现(EHCache),因为您将运行多个EHCache实例,并且写入一个EHCache不会反映在其他EHCache上。
相反,您应该使用AppEngine自己的memcache service。