Мы используем 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;
}
}