【发布时间】:2012-10-04 03:33:23
【问题描述】:
我的 Datanucleus JPA 2 Level 2 缓存未使用 Google App Engine Memcache 服务在以下配置中遗漏了什么?我正在使用 GAE 1.7.2 SDK。
在persistence.xml中:
<persistence-unit name="transactions-optional">
<provider>org.datanucleus.api.jpa.PersistenceProviderImpl</provider>
<properties>
<property name="datanucleus.NontransactionalRead" value="true"/>
<property name="datanucleus.NontransactionalWrite" value="true"/>
<property name="datanucleus.ConnectionURL" value="appengine"/>
<property name="datanucleus.appengine.datastoreReadConsistency" value="EVENTUAL" />
<property name="javax.persistence.query.timeout" value="5000" />
<property name="datanucleus.datastoreWriteTimeout" value="10000" />
<property name="datanucleus.singletonEMFForName" value="true"/>
<property name="datanucleus.cache.level2.cacheName" value="someName"/>
<property name="datanucleus.cache.level2.type" value="javax.cache"/>
</properties>
</persistence-unit>
实体注释包含:
@Entity
@Cacheable(true)
我的 WEB-INF/lib 如下所示:
-rw-r--r-- 1 501 20 27M Oct 3 16:13 appengine-api-1.0-sdk-1.7.2.jar
-rw-r--r-- 1 501 20 3.3M Oct 3 16:13 appengine-api-labs.jar
-rw-r--r-- 1 501 20 5.0M Oct 3 16:13 appengine-endpoints.jar
-rw-r--r-- 1 501 20 6.8K Oct 3 16:13 appengine-jsr107cache-1.7.2.jar
-rw-r--r-- 1 501 20 45K Oct 3 16:13 asm-4.0.jar
-rw-r--r-- 1 501 20 309K Oct 3 16:13 datanucleus-api-jdo-3.1.0-m3.jar
-rw-r--r-- 1 501 20 246K Oct 3 16:13 datanucleus-api-jpa-3.1.0-m3.jar
-rw-r--r-- 1 501 20 331K Oct 3 16:13 datanucleus-appengine-2.1.0-final.jar
-rw-r--r-- 1 501 20 1.6M Oct 3 16:13 datanucleus-core-3.1.0-m5.jar
-rw-r--r-- 1 501 20 112K Oct 3 16:13 geronimo-jpa_2.0_spec-1.0.jar
-rw-r--r-- 1 501 20 5.2M Oct 3 16:13 gwt-servlet.jar
-rw-r--r-- 1 501 20 196K Oct 3 16:13 jdo-api-3.0.1.jar
-rw-r--r-- 1 501 20 7.9K Oct 3 16:13 jsr107cache-1.1.jar
-rw-r--r-- 1 501 20 15K Oct 3 16:13 jta-1.1.jar
在WEB-INF/lib目录下,运行:
for i in *.jar; do echo $i; jar -tf $i | grep Level2; done
产量:
appengine-api-1.0-sdk-1.7.2.jar
appengine-api-labs.jar
appengine-endpoints.jar
appengine-jsr107cache-1.7.2.jar
asm-4.0.jar
datanucleus-api-jdo-3.1.0-m3.jar
datanucleus-api-jpa-3.1.0-m3.jar
datanucleus-appengine-2.1.0-final.jar
datanucleus-core-3.1.0-m5.jar
org/datanucleus/cache/WeakLevel2Cache.class
org/datanucleus/cache/Level2Cache$PinnedClass.class
org/datanucleus/cache/AbstractLevel2Cache.class
org/datanucleus/cache/SoftLevel2Cache.class
org/datanucleus/cache/Level2Cache.class
org/datanucleus/cache/NullLevel2Cache.class
org/datanucleus/cache/JavaxCacheLevel2Cache.class
geronimo-jpa_2.0_spec-1.0.jar
gwt-servlet.jar
jdo-api-3.0.1.jar
jsr107cache-1.1.jar
jta-1.1.jar
这表明 org.datanucleus.cache.JavaxCacheLevel2Cache 存在于 datanucleus-core-3.1.0-m5.jar 中。然而,当我尝试访问在启用此缓存之前已持久化的实体时,我在服务器端收到以下错误。
org.datanucleus.exceptions.NucleusUserException: Level 2 Cache "javax.cache" is registered to use class "org.datanucleus.cache.JavaxCacheLevel2Cache" yet this is not found. Please check your CLASSPATH and plugin specification.
进一步向下异常堆栈跟踪,我发现:
Caused by: java.lang.NoClassDefFoundError: javax/cache/Caching
at org.datanucleus.cache.JavaxCacheLevel2Cache.<init>(JavaxCacheLevel2Cache.java:63)
现在,这很清楚,但我在哪里可以找到这个 javax.cache.Caching?我应该在类路径中包含哪个 JAR?粗略的 Google 搜索并不能立即回答我的问题。
谢谢。
【问题讨论】:
-
添加了repo1.maven.org/maven2/javax/cache/cache-api/0.5/…。它包含 javax.cache.Caching 但现在我有一个不同的错误:` 原因:java.lang.IllegalStateException:在类路径中找不到 CachingProviders。 ` 用 JPA(甚至 JDO)在 App Engine 上使用二级缓存真的有这么难吗?
-
我在类路径中使用了 GAE 和 L2 缓存,通过 memcached、DN3.1 和“jcache”和“datanucleus-cache”(在查看了 SO 中的其他帖子之后),所有的作品都适用于我
-
谢谢尼尔。您能否确认您在 war/WEB-INF/lib 中使用的确切 datanucleus-cache JAR 文件?另外,你有它的链接吗?您使用的是哪个版本的 AppEngine SDK?
-
datanucleus-cache 3.1.1 和 GAE 1.7.1
-
好的,将在 GAE 1.7.2 上试用(现在无法返回 1.7.1)并报告。
标签: google-app-engine caching jpa-2.0 datanucleus