2017-02-07 27 views
0

쿼리 개체의 close() 메서드를 사용할 때 명확한 설명서를 찾을 수 없습니다. 다음 예제에서는 resource with try가 Autocloseable.close()를 호출하여 PersistenceManager와 Query를 닫습니다. 내부적으로 Query.close()를 호출하면 반환 된 모든 결과를 닫는 Query.closeAll()이 호출됩니다.JDO DataNucleus를 사용하는 경우 Query.close()

Collection<Object> returnedEntities = new ArrayList<>(); 

    Transaction tx = null; 
    try (PersistenceManager pm = DataStore.getInstance().getPM(); 
      Query< Object>query = pm.newQuery(Object.class);) { 
     tx = pm.currentTransaction(); 

     tx.begin(); 
     query.setOrdering(<ordering>); 
     query.setFilter(<some filters go here>); 
     query.declareParameters(<parameterType>); 
     returnedEntities = (Collection<Object>) query.execute(<parameterValue>); 
     returnedEntities = pm.detachCopyAll(returnedEntities); 
     tx.commit(); 

    } catch (Exception e) { 
     //some error handling goes here... 
    } finally { 
     if (tx != null && tx.isActive()) { 
      tx.rollback(); 
     } 
    } 

이 쿼리 개체에 필요한 Query.close()의 호출인가, 아니면 그것은 PersistenceManager를 폐쇄하도록 충분하고 그 다음 나머지를 닫? 일부 문서 또는 링크는 대단히 감사하겠습니다. 감사!

답변

1

Query 결과에 PM이 L1 캐시 등을 가지고 있기 때문에 결과를 생성 한 사람이 PersistenceManager (PM)보다 오래 걸리지 않습니다 (결과의 행이 분리 되어도 계속 존재하지만 쿼리 결과 세트는 닫힙니다.). PM을 닫으면 모든 책임을지고있는 모든 리소스가 닫힙니다 (모든 쿼리 포함). 따라서 PM 유효 기간 동안 내 검색어를 삭제해야합니까 (예 : 귀하의 PM이 오래 살았습니까?) 그렇다면 Query에서 closeAll() 또는 close()를 사용하십시오.

+0

완벽한 답변. 고맙습니다! –