2014-05-22 65 views
0

短暫訪問收集我在我所有的管理者必須返回瞬態收集特定的查詢方法,但我想執行它後立即關閉查詢。DataNucleus將查詢:收盤後

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()); 

,但我想避免這種情況,即使這是一個本地副本,它不是一個深刻的克隆,但它仍然分配所需要的元素(因此,在某些時候是整個陣列的空間將分配兩次內存),我想避免這種情況。

我是我缺少的東西? 有沒有辦法避免創建克隆

回答

0

嘛,我發現這種現象的原因:

查詢返回的對象(集合)如果一個實例:org.datanucleus.store.rdbms.query。 ForwardQueryResult
延伸:AbstractRDBMSQueryResult
延伸:AbstractQueryResult
延伸:AbstractList的

所以,我得到一個對象,它是一個列表實現,並且查詢結果必然該實施。

/** 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(); 
} 

所以,我不能避免新陣列的創建...