Datanucleus Query:关闭后访问瞬态收集

时间:2014-05-22 04:53:05

标签: collections jdo datanucleus transient

我的所有经理都有一个特定的查询方法,必须返回瞬态集合,但我想在执行后立即关闭查询。

tx.begin();
Query query=pm.newQuery(...);
Collection col=(Collection)query.execute();
pm.makeTransientAll(col,true);
query.close();
tx.commit();

问题:查询关闭后无法访问集合(DN知道身份?)否则会抛出"查询已关闭"错误!

解决方案:创建原始集合的COPY!

Collection col=new ArrayList((Collection)query.execute());

但我想避免这种情况......即使它是本地副本并且它不是深度克隆,它仍然会分配整个元素数组所需的空间(所以,在某些时候会有2倍的分配内存),我想避免这种情况。

我错过了什么? 有没有办法避免创建克隆

1 个答案:

答案 0 :(得分:0)

好吧,我找到了这种行为的原因:

如果实例为:org.datanucleus.store.rdbms.query。 ForwardQueryResult ,则返回查询对象(集合) 扩展: AbstractRDBMSQueryResult
扩展: AbstractQueryResult
扩展:抽象列表

所以,我得到一个LIST实现的对象,查询结果绑定到该实现。

/** The Result Objects. */
protected List resultObjs = new ArrayList();

/**
 * Method to return the results as an array.
 * @return The array.
 */
public synchronized Object[] toArray()
{
    assertIsOpen();
    advanceToEndOfResultSet();

    return resultObjs.toArray();
}

所以,我无法避免创建一个新阵列......