【问题标题】:When to use JDO DataNucleus Query.close()何时使用 JDO DataNucleus Query.close()
【发布时间】:2017-02-07 15:22:09
【问题描述】:

我无法找到何时使用查询对象的 close() 方法的明确文档。在以下示例中,try with resources 通过调用 Autocloseable.close() 关闭 PersistenceManager 和 Query。在内部 Query.close() 调用 Query.closeAll(),它关闭所有返回的结果。

    Collection<Object> returnedEntities = new ArrayList<>();

    Transaction tx = null;
    try (PersistenceManager pm = DataStore.getInstance().getPM();
            Query< Object>query = pm.newQuery(Object.class);) {
        tx = pm.currentTransaction();

        tx.begin();
        query.setOrdering(<ordering>);
        query.setFilter(<some filters go here>);
        query.declareParameters(<parameterType>);
        returnedEntities = (Collection<Object>) query.execute(<parameterValue>);
        returnedEntities = pm.detachCopyAll(returnedEntities);
        tx.commit();

    } catch (Exception e) {
        //some error handling goes here...
    } finally {
        if (tx != null && tx.isActive()) {
            tx.rollback();
        }
    }

这是查询对象所必需的 Query.close() 调用,还是足以关闭 PersistenceManager 然后关闭其余部分?一些文档或链接非常感谢。谢谢!

【问题讨论】:

    标签: java sql jdo datanucleus autocloseable


    【解决方案1】:

    Query 结果不会比创建它们的 PersistenceManager (PM) 更持久,因为 PM 具有 L1 缓存等(除了结果行被分离,因此它们继续存在但查询结果集将被关闭)。关闭 PM 将关闭它负责的所有资源(包括所有查询)。所以你只需要决定我是否需要在 PM 的生命周期内清除我的查询(即你的 PM 是否长寿?),如果是这样,那么在 Query 上使用 closeAll() 或 close()。

    【讨论】:

    • 完美答案。谢谢!
    • 我也有同样的问题。许多年前,当我开始使用 DataNucleus 时,我曾经有很长的 PM,但很久以前就看到了光明,现在我所有的 DataNucleus/JDO PM 都是短暂的,我以正确的方式使用分离/附加。因此,在每次查询之后释放查询的代码可能不再需要了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多