0

我正在使用 DataNucleus 3.0.0-release 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字段,但有时会像调用. 该字段被标记为在 中,因此每次都应该加载它。UserProfilenullgetObjectById()defaultFetchGroup

这可能是 DataNucleus 错误(竞争条件?)?还有其他人遇到同样的问题吗?

注意:我知道 DataNucleus 3.1.0-release 可用,但我不能使用它,因为它的增强器有问题

4

1 回答 1

0

我已经关闭了 DataNucleus 二级缓存,从初步测试来看,这个问题似乎已经消失了。

要关闭二级缓存,将以下行添加到您的 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 回答