我什么时候应该在JDO中调用javax.jdo.Query.close(Object)和持久化管理器?

问题描述 投票:0回答:2

我有一个旧项目,我使用 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吗?

java spring-boot jdo datanucleus
2个回答
0
投票

您可以测试此代码:

  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();
    }
  }

0
投票

我在一个旧项目中遇到了类似的问题。问题是,当您返回用户列表时,该列表会链接到查询执行,最后您关闭查询,因此您可以尝试返回一个新列表,该列表不会链接到查询

    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();
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.