5

不知何故,我与 mongodb 交谈的 java 应用程序最终得到了大量名为 MongoCleanerXXX 的停放(休眠)线程,我认为这些线程来自驱动程序。其中的数量约为600。显然,在重新启动 mongod 一段时间后,数据库确实存在一些连接问题。

MongoDB Java 驱动版本是 2.10.1 MongoDB 版本是 2.2.0

这可能是什么原因以及我应该做错什么才能导致它作为 MongoDB 的客户端应用程序?

4

2 回答 2

4

如果没有在适当的时间调用 MongoClient.close(),有时我们会看到很多这样的清理线程。

例如:

  • 取消部署 webapp 时(参见JAVA-817
  • 身份验证失败时(参见JAVA-831

最初清理这些线程时存在一些竞争条件,但这已在 Java 驱动程序的 2.6 版中得到修复。

于 2013-07-02T13:00:13.583 回答
3

请参阅http://docs.mongodb.org/ecosystem/tutorial/getting-started-with-java-driver/

MongoClient 类被设计为线程安全并在线程之间共享。通常,您只为给定的数据库集群创建 1 个实例并在您的应用程序中使用它。如果出于某种原因您决定创建许多 MongoClient 实例,请注意:

  • 所有资源使用限制(最大连接数等)适用于每个 MongoClient 实例
  • 要处理实例,请确保调用 MongoClient.close() 来清理资源

将 MongoClient 调用切换为单例:

static public MongoClient mongoClientInstance = null;
public static synchronized MongoClient getMongoClientInstance(String host) {
    if (mongoClientInstance == null) {
        try {
            mongoClientInstance = new MongoClient(host);
        } catch (UnknownHostException e) {
            e.printStackTrace();
        }
    }
    return mongoClientInstance;
}

似乎工作得很好。

于 2014-05-27T20:20:33.623 回答