0

DataNucleus 3.0.0 リリースの JDO 実装を使用して、Java アプリを MongoDB に接続しています。

私の CLASSPATH 内の関連する JAR は次のとおりです。

  • datanucleus-api-jdo-3.0.0-release.jar
  • datanucleus-core-3.0.0-release.jar
  • datanucleus-jdo-query-3.0.0-release.jar
  • datanucleus-mongodb-3.0.0-release.jar
  • mongo-java-driver-2.5.2.jar

更新: この問題はバージョン 3.1 でも発生し、DataNucleus の Level2 キャッシュに関連しています。回避策については、以下の私の回答を参照してください。

ロードしようとしているクラスは次のとおりです。

@PersistenceCapable(detachable = "true")
public class UserProfile implements Serializable, Cacheable<String> {

    private static final long serialVersionUID = 7132595253084641884L;

    @PrimaryKey
    @Persistent(defaultFetchGroup = "true")
    private String username;

    @Persistent(defaultFetchGroup = "true")
    private String name;

    @Persistent(defaultFetchGroup = "true")
    private String surname;

    @Persistent(embeddedElement = "true", defaultFetchGroup = "true")
    private Map<String, UserProfileSummary> connections;

    ...
}

以下は UserProfileSummary クラスです。

@PersistenceCapable(embeddedOnly = "true")
public class UserProfileSummary implements Serializable {

    private static final long serialVersionUID = 6120670018375572406L;

    @Persistent(defaultFetchGroup = "true")
    private String username;

    @Persistent(defaultFetchGroup = "true")
    private String fullName;
    ...
}

以下は、タイプの格納されたオブジェクトをロードしようとしている方法ですUserProfile:

PersistenceManager pm = MyPersistenceManagerFactory.get().getPersistenceManager();

UserProfile profile = null;
try {
    profile = pm.getObjectById(UserProfile.class, username);
}
catch (JDOObjectNotFoundException onfe) {
    // handle
}
catch (Exception e) {
    // handle
}

問題は、 のconnectionsフィールドがUserProfile正しくロードされることもあれば、nullへの同じ呼び出しと同じようにロードされることもありgetObjectById()ます。フィールドは にあるようにマークされているdefaultFetchGroupため、毎回ロードする必要があります。

これは DataNucleus のバグ (競合状態?) でしょうか? 他の誰かが同じ問題を経験していますか?

注: DataNucleus 3.1.0 リリースが利用可能であることは知っていますが、エンハンサーに問題があるため使用できません。

4

1 に答える 1

0

DataNucleus レベル 2 キャッシュをオフにしました。予備テストでは、この問題は解消されたようです。

レベル 2 キャッシュをオフにするには、次の行を jdoconfig.xml に追加します。

<jdoconfig xmlns="http://java. ... .xsd">
    <persistence-manager-factory name="MyPMF">
        ...
        <property name="datanucleus.cache.level2.type" value="none" />
    </persistence-manager-factory>
</jdoconfig>
于 2012-08-08T14:32:19.670 に答える