我有一个旧项目,我使用 JDO 从数据存储区获取数据。我有以下代码
public List<User> findAll() {
LOGGER.info("Getting users list");
Query query = null;
PersistenceManager pm = PMF.get().getPersistenceManager();
try {
query = pm.newQuery(User.class);
List<User> user = (List<User>) query.execute();
return user;
} catch (Exception e) {
LOGGER.error("Error while getting user list", e);
return Collections.emptyList();
} finally {
if(query != null) query.closeAll();
pm.close();
}
}
我从我的服务中调用上述方法,当我尝试处理结果时,我收到一个错误:
javax.jdo.JDOUserException:查询结果已关闭
我尝试将结果集复制到新列表并返回它,但它也不起作用。
List<User> user = (List<User>) query.execute();
return new ArrayList<>(user);
我该如何解决这个问题?难道我们不应该关闭查询并pm吗?
您可以测试此代码:
public List<User> findAll() {
LOGGER.info("Getting users list");
PersistenceManager pm = PMF.get().getPersistenceManager();
Query query = pm.newQuery(User.class);
try {
return (List<User>) query.execute();
} catch (Exception e) {
LOGGER.error("Error while getting user list", e);
return Collections.emptyList();
} finally {
query.closeAll();
}
}
我在一个旧项目中遇到了类似的问题。问题是,当您返回用户列表时,该列表会链接到查询执行,最后您关闭查询,因此您可以尝试返回一个新列表,该列表不会链接到查询
public List<User> findAll() {
LOGGER.info("Getting users list");
Query query = null;
PersistenceManager pm = PMF.get().getPersistenceManager();
try {
query = pm.newQuery(User.class);
List<User> users = new LinkedList<>((List<User>) query.execute());
return users;
} catch (Exception e) {
LOGGER.error("Error while getting user list", e);
return Collections.emptyList();
} finally {
if(query != null) query.closeAll();
pm.close();
}
}