数据核。偶尔出现javax.jdo.JDODetachedFieldAccessException:您刚刚尝试访问字段“ linkedObject”

时间:2018-06-28 17:05:47

标签: datanucleus

我们将Java Datanucleus 5.0.2与JDO一起使用。

当多个线程检索相同的信息并且没有线程更改此特定的“ linkedObject”引用时,我们偶尔会遇到异常。

注意:使用获取计划检索对象,日志显示该内容。

由于这是一个竞争条件,因此很难编写一个测试用例以使其失败。但是,尽管如此,我想问问是否有人经历过?

由以下原因引起:javax.jdo.JDODetachedFieldAccessException:您刚刚尝试访问字段“ linkedObject”,但是在分离对象时,该字段并未分离。不要访问该字段,或者在分离对象时将其分离。     在com.company.BaseClass.dnGetlinkedObject(BaseClass.java)     在com.company.BaseClass.getLinkedObject(BaseClass.java:71) ...

我可以看到三个线程在调用此方法

private static <T> T getUniqueQueryJDO(final PersistenceManager pm, final JDOQLQuery query) throws PersistenceException {
    try {
        final javax.jdo.Query jdoQuery = setUpJDOQuery(pm, query);
        jdoQuery.setUnique(true);
        T result = null;
        final T queryResult = (T) jdoQuery.executeWithMap(query.getMapValues());
        if (queryResult != null) {
            result = pm.detachCopy(queryResult);
        }
        jdoQuery.closeAll();
        return result;
}

其中一个随机失败

BaseClass.java

@PersistentDomainObject
@PersistenceCapable(table = "BaseClass", detachable = TRUE)
@Inheritance(strategy = InheritanceStrategy.SUPERCLASS_TABLE)
@FetchGroups(
...
@FetchGroup(name = FETCH_LINKED_OBJECT, members = {@Persistent(name = "linkedObject")})})
...
public class BaseClass {
...
public static final String FETCH_LINKED_CLASS = "FETCH_NAME";
...
    @Persistent(defaultFetchGroup = FALSE, columns = {@Column(name = "linkedObjectId", allowsNull = FALSE)}, nullValue = NullValue.EXCEPTION)
    private LinkedClass linkedObject;
...
    public LinkedClass getLinkedObject() {
        return linkedObject;
    }
}

0 个答案:

没有答案