2

次の構成で、DatanucleusJPA2レベル2キャッシュがGoogleAppEngine Memcacheサービスを使用していないという点で何が欠けていますか?GAE1.7.2SDKを使用しています。

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はどれですか?大雑把なグーグル検索は私の質問にすぐには答えません。

ありがとう。

4

1 に答える 1

1

Google の「memcached」は、標準の「javax.cache」になる古いバージョンを使用しています。DataNucleus 3.0 は、この古いバージョンのみをサポートします (プロパティはそのままです)。DataNucleus 3.1 は、古いバージョンの javax.cache と最新バージョンの両方をサポートしています。古いバージョン (すなわち GAE memcached) を DN 3.1 で使用するには、プロパティdatanucleus.cache.level2.typejcacheに設定する必要があります。http://www.datanucleus.org/products/accessplatform_3_1/jpa/cache.html#jcacheを参照してください。

なぜ DataNucleus バージョン 3.1.0-m3/m5 を使用しているのですか。

于 2012-10-04T07:59:54.400 に答える