【问题标题】:MongoDB, Java: accessing cursor opens connection that cannot be closedMongoDB,Java:访问游标打开无法关闭的连接
【发布时间】:2014-04-06 16:40:02
【问题描述】:

我在关闭访问 MongoDB 游标后始终创建的连接时遇到问题。

我正在从正在运行的 mongod 实例的控制台收集有关连接的信息。我还没有使用任何 mongodb 复制或分片。

例如导致打开连接的示例代码(假设“myQuery”只是一些查询,coll 使用 setInternalClass 映射到 MyObject 类):

  DBCursor find = coll.find(myQuery);
  List<MyObject> myObjects = new ArrayList<MyObject>();
  while(find.hasNext()) { // this line opens the connection
        MyObject next = (MyObject) find.next();
        myObjects.add(next);
  }
  find.close(); // this line will not close the connection

【问题讨论】:

    标签: java mongodb connection


    【解决方案1】:

    您正在对您的查找对象调用 close,该对象是一个 DBCursor。正如API Documentation 中提到的,这只会关闭游标,而不是底层连接。要关闭连接,您应该在 Mongo/MongoClient 对象上调用 close,该对象继承或具有一个 close 函数,该函数将 as per the API 关闭与 MongoDB 服务器实例的所有连接。

    【讨论】:

    • 嗨,戴维,谢谢。但是,为整个正在运行的应用程序拥有一个 mongo 客户端实例也是一种好习惯,因此在企业应用程序中在客户端上调用 close 并不是一个好主意,不是吗?
    • 驱动有一个连接池,可以通过MongoOptions配置,随时打开多个已建立的空闲连接,方便查询更快。你说得对,在你的应用程序终止之前你不需要关闭这个池。
    • 所以换句话说,我可以忽略打开的连接,因为 MongoDB 会处理它并在需要时关闭其中的一些?
    • 这是一般原则。你应该检查Java驱动并发页面,它有很多deail->docs.mongodb.org/ecosystem/drivers/java-concurrency
    • 抱歉,由于内存不足,正在调查同一问题。因此可以在日志文件中包含 [conn3500] 吗?我怀疑它是。 (数字增加,没有关闭)
    猜你喜欢
    • 2012-06-09
    • 2016-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-10
    • 1970-01-01
    • 2011-11-11
    • 1970-01-01
    相关资源
    最近更新 更多