DataNucleus. Случайный javax.jdo.JDODetachedFieldAccessException: вы только что попытались получить доступ к полю "connectedObject" - PullRequest
0 голосов
/ 28 июня 2018

Мы используем Java Datanucleus 5.0.2 с JDO.

Мы получаем случайное исключение, когда несколько потоков извлекают одну и ту же информацию, и ни один поток не изменяет эту конкретную ссылку "связанный объект".

ПРИМЕЧАНИЕ. Объект извлекается с использованием плана выборки, и журналы показывают, что.

Трудно написать контрольный пример, чтобы это не сработало, поскольку это состояние гонки. Но тем не менее я хочу спросить, испытал ли это кто-то?

Причина: javax.jdo.JDODetachedFieldAccessException: вы только что попытались получить доступ к полю «connectedObject», но это поле не было отсоединено при отсоединении объекта. Либо не получите доступ к этому полю, либо отсоедините его при отсоединении объекта. в 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;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...