Google app engine 如何解决对象管理器已关闭错误?
如果有人能给我指点关于如何关闭的教程或最佳实践,我将不胜感激 JDO连接。 每当我包含finally块时,我总是得到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
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