【问题标题】:Datanucleus Query: accessing transient collection after closeDatanucleus Query:关闭后访问瞬态集合
【发布时间】:2014-07-10 23:22:55
【问题描述】:

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

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

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

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

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

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

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

【问题讨论】:

    标签: collections jdo datanucleus transient


    【解决方案1】:

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

    如果是以下实例,则返回(集合)查询对象:org.datanucleus.store.rdbms.query。ForwardQueryResult
    扩展:AbstractRDBMSQueryResult
    扩展:AbstractQueryResult
    扩展:AbstractList

    所以,我得到了一个 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();
    }
    

    所以,我无法避免创建一个新数组...

    【讨论】:

      猜你喜欢
      • 2013-11-10
      • 2011-02-04
      • 2013-01-15
      • 2014-12-14
      • 1970-01-01
      • 1970-01-01
      • 2020-11-16
      • 1970-01-01
      • 2021-11-06
      相关资源
      最近更新 更多