0

我在 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)

如何解决这个问题?

4

2 回答 2

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>
于 2012-09-16T16:32:47.967 回答
1

AppEngine 是一个分布式系统,请求由多个前端实例自动处理。在这样的设置中,您不能在前端实例上使用缓存实现 (EHCache),因为您将运行多个 EHCache 实例,并且写入一个 EHCache 不会反映在其他 EHCache 上。

相反,您应该使用 AppEngine 自己的memcache 服务

于 2012-09-07T08:14:58.490 回答