2014-05-22 3 views
0

임시 컬렉션을 반환해야하는 모든 관리자에게 특정 쿼리 방법이 있지만 실행 후 바로 닫고 싶습니다.Datanucleus Query : 닫은 후 임시 컬렉션에 액세스

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 배 배정 된 메모리 될 것) 그리고 나는 그것을 피하고 싶습니다.

내가 뭔가를 놓친 것입니까? 복제본 생성을 피하는 방법이 있습니까?

는 쿼리 개체 (컬렉션) 반환하는 경우의 예 :

답변

0

글쎄, 나는이 행동의 이유를 발견 org.datanucleus.store.rdbms.query. 확장 AbstractQueryResult
: 확장 AbstractRDBMSQueryResult
: 를 확장
ForwardQueryResult 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(); 
} 

그래서, ...

새로운 배열의 생성을 피할 수 없다
관련 문제