Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Google app engine 如何解决对象管理器已关闭错误?_Google App Engine_Jdo - Fatal编程技术网

Google app engine 如何解决对象管理器已关闭错误?

Google app engine 如何解决对象管理器已关闭错误?,google-app-engine,jdo,Google App Engine,Jdo,如果有人能给我指点关于如何关闭的教程或最佳实践,我将不胜感激 JDO连接。 每当我包含finally块时,我总是得到javax.jdo.JDOUserException:对象管理器已关闭错误。 我的代码如下: public static List<AgentEntity> findAgentEntityByString(String id) { List<AgentEntity> agententity = new ArrayList<AgentEntity

如果有人能给我指点关于如何关闭的教程或最佳实践,我将不胜感激 JDO连接。 每当我包含finally块时,我总是得到
javax.jdo.JDOUserException:对象管理器已关闭
错误。
我的代码如下:

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;
  }
公共静态列表findAgentEntityByString(字符串id){
List Agentity=new ArrayList();
if(id==null){
返回null;
}
试一试{
Query q=pm.newQuery(“从“+AgentEntity.class.getName()中选择id”);
agententity=(List)q.execute();
}捕获(例外情况除外){
log.warning(例如getMessage());
}
返回代理;
}

关于

避免此延迟加载问题的一个可能解决方案是使用
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();
    }        
  }

公共静态列表。

为什么要在此处关闭PersistenceManager? 如果要关闭查询,应使用
javax.jdo.Query.closeAll()
javax.jdo.Query.close(对象结果)
。 因此,您可以对结果进行临时复制,然后关闭查询及其结果:

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();
    }
  }        
} 
公共静态列表findAgentEntityByString(字符串id){
if(id==null){
返回null;
}
查询q=null;
试一试{
q=pm.newQuery(“从“+AgentEntity.class.getName()中选择id”);
返回新的ArrayList((List)q.execute());
}最后{
如果(q!=null){
q、 closeAll();
}
}        
} 
或者,您可以稍后明确关闭结果:

public static List<AgentEntity> findAgentEntityByString(String id) {
  if (id == null) {
    return null;
  }
  Query q = pm.newQuery("select id from " + AgentEntity.class.getName());
  return (List<AgentEntity>) q.execute();
  }        
}
....
List agents = X.findAgentEntityByString("Foobar");
....
pm.close(agents);
公共静态列表findAgentEntityByString(字符串id){
if(id==null){
返回null;
}
Query q=pm.newQuery(“从“+AgentEntity.class.getName()中选择id”);
返回(列表)q.execute();
}        
}
....
列表代理=X.findAgentityByString(“Foobar”);
....
下午六时正(代理);

在获取PM之后,尝试设置提取计划,然后在执行查询之前将其设置为“全部”:

导入javax.jdo.FetchPlan

    pm = PMF.get().getPersistenceManager();
    FetchPlan fp = pm.getFetchPlan();
    fp.setGroup(FetchPlan.ALL);

事实上,我的答案是:


我有一个对持久性管理器的实例引用,我只创建了一个本地实例,所有错误都已修复

也许可以解决“finally”中发生的问题(我在您的示例中没有看到)。可能正在分离东西?或者在PM关闭后您正在访问东西吗?如果我包括finally块,我会得到持久性管理器已关闭错误。所以我干脆把它拆了。当我这样做时,代码运行良好,但日志仍然抱怨“持久性管理器已关闭”。这样,我无法检索存储在Spring控制器GET请求上的ModelAttribute中的数据,但您仍然没有说明PM的“关闭”中发生了什么,或者“最终块”中有什么代码。日志告诉您发生了什么,但我们没有看到它,因为它位于finally@datanuclaus,
finally{pm.close();}
我正在从Spring控制器GET请求调用DAO方法findAgentEntityByString(),在这个示例中,这意味着我必须关闭Spring端的结果,对吗?我尝试了上面的代码,仍然没有成功。下面是错误堆栈:
持久性管理器已关闭,原因是:javax.jdo.JDOFatalUserException:持久性管理器已在org.datanucleus.jdo.JDOPersistenceManager.assertIsOpen(JDOPersistenceManager.java:2125)在org.datanucleus.jdo.JDOPersistenceManager.newQuery(JDOPersistenceManager.java:1247)关闭位于org.opevel.server.dao.AgentEntityDAOImpl.findAgentEntityByString(AgentEntityDAOImpl.java:107)处的org.opevel.web.AgentController.handleRequest处的org.datanucleus.jdo.JDOPersistenceManager.newQuery(JDOPersistenceManager.java:1234)(
使用上述代码,我得到以下
对象管理器已关闭,原因是:javax.jdo.JDOUserException:org.datanucleus.jdo.NucleusJDOHelper.getJDOExceptionForNucleusException(NucleusJDOHelper.java:375)在org.datanucleus.jdo.JDOPersistenceManager.close(JDOPersistenceManager.java:281)关闭对象管理器)位于org.opevel.server.dao.AgentEntityDAOImpl.findAgentEntityByString(AgentEntityDAOImpl.java:95),位于org.opevel.web.AgentController.handleRequest(AgentController.java:80),位于sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method),位于sun.reflect.NativeMethodAcc