MongoDB - 大量的MongoCleaner线程

时间:2013-06-26 18:09:11

标签: mongodb

不知怎的,我的java应用程序与mongodb交谈后出现了大量名为MongoCleanerXXX的驻留(休眠)线程,我认为这些线程来自驱动程序。那些人数是~600。显然,数据库存在一些连接问题,在mongod重启后一段时间后确实恢复了。

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

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

2 个答案:

答案 0 :(得分:4)

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

例如:

  • 取消部署网络应用时(请参阅JAVA-817
  • 身份验证失败时(请参阅JAVA-831

最初有一些race conditions around cleaning up these threads,但这已在Java驱动程序的2.6版中修复。

答案 1 :(得分:3)

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

  

MongoClient类设计为线程安全并在其中共享   线程。通常,您只为给定的数据库创建一个实例   集群并在整个应用程序中使用它。如果由于某种原因你   决定创建许多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;
}

似乎工作得很好。