対象

GAE SDK 1.2.5

Google App Engine for JavaのJDO

JDOの検索で取得したListにアクセスすると、org.datanucleus.exceptions.NucleusUserException: Object Manager has been closedで落ちることがある。
PersistenceManager pm = JDOHelper.getPersistenceManagerFactory("transactions-optional").getPersistenceManager();
try {
   Query query = pm.newQuery(Hoge.class);
   if (condition != null) {
      query.setFilter("(項目名) == condition");
      query.declareParameters("String condition");
   }
   List<Hoge> result = (List<Hoge>) query.execute(condition);
   return result;
} finally {
   pm.close();
}

JDOでアクセスして取得した結果のListは、取得した瞬間ではまだロードされておらず、Listにアクセスした時点で初めてロードされるみたいです。
この時、Listにアクセスせずに、PersistenceManagerをcloseしてしまうと、二度とListの中身にはアクセスできないみたい。
これを回避するためには、アクセスした結果を"detach"しないといけないらしい。
detachする手っ取り早い方法は以下のように、pm.detachCopyAll(List)を呼び出す。
他にもいろいろ方法があるようです。

PersistenceManager pm = JDOHelper.getPersistenceManagerFactory("transactions-optional").getPersistenceManager();
try {
   Query query = pm.newQuery(Hoge.class);
   if (condition != null) {
      query.setFilter("(項目名) == condition");
      query.declareParameters("String condition");
   }
   List<Hoge> result = (List<Hoge>) query.execute(condition);
   pm.detachCopyAll(result);
   return result;
} finally {
   pm.close();
}

コメントをかく


「http://」を含む投稿は禁止されています。

利用規約をご確認のうえご記入下さい

管理人/副管理人のみ編集できます