【问题标题】:Datanucleus JPA 2 Level 2 cache in Google AppEngineGoogle AppEngine 中的 Datanucleus JPA 2 2 级缓存
【发布时间】: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


【解决方案1】:

Google 的“memcached”使用旧版本的标准“javax.cache”。 DataNucleus 3.0 仅支持这个旧版本(具有您所拥有的属性)。 DataNucleus 3.1 支持 both 旧版本的 javax.cache 和最新版本。要使用 DN 3.1 的旧版本(即 GAE memcached),您需要将属性 datanucleus.cache.level2.type 设置为 jcache。见http://www.datanucleus.org/products/accessplatform_3_1/jpa/cache.html#jcache

为什么你使用 DataNucleus 版本 3.1.0-m3/m5 我不知道从那以后什么时候有很多版本!

【讨论】:

  • 感谢您告诉我。很快就会试试这个。 “为什么你使用 DataNucleus 版本 3.1.0-m3/m5 我不知道从那以后什么时候有很多版本!” -> 因为那是与 AppEngine 1.7.2 SDK 一起打包的版本。我知道较新的版本。我根本没有使用它们,因为我认为它可能会与最新的 AppEngine SDK 1.7.2 产生无法预料的不一致和版本不兼容。
  • 事实上,我过去确实尝试过“jcache”导致同样的问题。我怀疑我遗漏了一些重要的 JAR。请参阅我对原始问题的第一条评论。
  • 你的意思是像我给出的链接中明确提到的“datanucleus-cache”?
  • 我刚刚向 Google 告知了他们不明智的打包选择,希望他们能在下一个版本中修复它
  • 其实我上一条评论写错了。当我使用“jcache”时,错误是“jcache”没有注册,我需要检查我的 CLASSPATH。
猜你喜欢
  • 2011-01-01
  • 1970-01-01
  • 2015-10-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-22
  • 1970-01-01
相关资源
最近更新 更多