Как разрешить объект менеджер был закрыт ошибка? - PullRequest
4 голосов
/ 18 апреля 2011

Буду признателен, если кто-нибудь подскажет мне учебник или лучшую практику о том, как закрыть соединение JDO.Я постоянно получаю ошибку javax.jdo.JDOUserException: Object Manager has been closed всякий раз, когда я включаю блок finally.
Мой код ниже:

public static List<AgentEntity> findAgentEntityByString(String id) {
    List<AgentEntity> agententity = new ArrayList<AgentEntity>();
    if (id == null) {
      return null;
    }
    try {
        Query q = pm.newQuery("select id from " + AgentEntity.class.getName());
        agententity = (List<AgentEntity>) q.execute();
    } catch(Exception ex) {
        log.warning(ex.getMessage());
    }
        return agententity;
  }

С уважением

Ответы [ 4 ]

3 голосов
/ 18 апреля 2011

Одним из возможных решений этой проблемы lazy loading является использование метода size(), заставляющего объект PersistenceManager загружать список результатов из хранилища данных перед закрытием.

public static List<AgentEntity> findAgentEntityByString(String id) {
    List<AgentEntity> agententity = new ArrayList<AgentEntity>();
    if (id == null) {
      return null;
    }
    try {
        Query q = pm.newQuery("select id from " + AgentEntity.class.getName());
        agententity = (List<AgentEntity>) q.execute();
        agententity.size()  //Should populate the returned list
        return agententity;
    } finally {
      pm.close();
    }        
  }

Ссылка здесь .

0 голосов
/ 28 апреля 2015

На самом деле, что исправило это для меня, здесь ответили:

Почему я получаю исключение "Диспетчер постоянства закрыт"

У меня была ссылка на экземплярменеджер сохраняемости, я только что сделал локальный экземпляр, и все мои ошибки исправлены

0 голосов
/ 03 апреля 2015

Попробуйте установить план выборки сразу после получения PM, а затем установите его для всех перед выполнением запроса:

import javax.jdo.FetchPlan;

    pm = PMF.get().getPersistenceManager();
    FetchPlan fp = pm.getFetchPlan();
    fp.setGroup(FetchPlan.ALL);
0 голосов
/ 18 апреля 2011

Почему вы хотите закрыть свой PersistenceManager здесь?Если вы хотите закрыть Запрос, вы должны использовать либо javax.jdo.Query.closeAll(), либо javax.jdo.Query.close(Object result).Таким образом, вы можете сделать временную копию результата и затем закрыть запрос и его результат:

public static List<AgentEntity> findAgentEntityByString(String id) {
  if (id == null) {
    return null;
  }
  Query q = null;
  try {
      q = pm.newQuery("select id from " + AgentEntity.class.getName());
      return new ArrayList<AgentEntity>((List<AgentEntity>) q.execute());
  } finally {
    if(q!= null){
        q.closeAll();
    }
  }        
} 

или вы можете позже закрыть результат явно:

...