我们将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; } }