代码之家  ›  专栏  ›  技术社区  ›  Riley Lark

什么时候应该调用javax.jdo.Query.close(Object)?

jdo
  •  0
  • Riley Lark  · 技术社区  · 15 年前

    the docs

    我这样问是因为我试图用getUser(id)这样的函数来划分代码,这些函数将创建一个查询、获取用户并销毁查询。如果为了访问用户而不得不保留查询,那么我就不能真正地进行分区。

    如果我不对一个对象调用close,会发生什么?会被当作垃圾收集吗?我以后可以访问那个对象吗?

    请让我知道,如果我可以进一步具体说明我的问题。

    2 回复  |  直到 15 年前
        1
  •  2
  •   DataNucleus    15 年前

    你不能用 查询结果 对象

        2
  •  1
  •   Volksman    13 年前

    当查询方法返回单个对象时,很容易在返回单个对象之前关闭查询。

    这就需要负责关闭返回调用方集合的查询,如果调用方忽略关闭查询,则可能导致泄漏-我认为必须有一种更安全的方法,而且确实存在!

    长期使用DataNucleus的Guido创建了一个“自动关闭”集合facade,用于包装JDO的Query.execute方法返回的集合。用法非常简单:将查询结果包装在自动关闭集合对象的实例中:

    return q.execute();
    

    只需返回“自动关闭”包装版本:

    return new JDOQueryResultCollection(q, q.execute());
    

    对于调用方来说,它看起来像任何其他集合,但包装器保留对创建集合结果的查询的引用,并在GC释放包装器时自动关闭它。

    http://www.expojo.com/

    JDOQueryResultCollection是唯一直接使用的类,但它确实有一些支持类。

    只需将jar添加到项目中,并将com.sas.framework.expojo.jdo.JDOQueryResultCollection导入任何包含将结果作为集合返回的查询方法的Java文件。

    或者,您可以从jar中提取源文件并将其包含在项目中:它们是:

    JDOQueryResultCollection.java
    Disposable.java
    AutoCloseQueryIterator.java
    ReadonlyIterator.java
    
    推荐文章