2017-02-07 123 views
0

クエリオブジェクトのclose()メソッドを使用するときに明確なドキュメントが見つかりませんでした。次の例では、リソースを含む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の呼び出し(IS)またはそれは十分のPersistenceManagerが閉じられた後、残りを閉じること持っているのですか?いくつかのドキュメントやリンクは非常に感謝しています。ありがとう! PMは離れ結果の行が外れているときから、(L1キャッシュなどを持っているので、彼らは存在し続けますが、クエリの結果セットが閉じられますので、

答えて

1

Queryの結果は、それらを作成しPersistenceManager(PM)をより長持ちしません。 )。 PMを閉じる​​と、担当するすべてのリソース(すべてのクエリを含む)が閉じられます。したがって、PMの存続期間中にクエリをクリアする必要があるかどうかを判断する必要があります(つまり、あなたのPMは長生きですか?)場合は、QueryでcloseAll()またはclose()を使用してください。

+0

完璧な答え。ありがとうございました! –

関連する問題