不知怎的,我的java应用程序与mongodb交谈后出现了大量名为MongoCleanerXXX的驻留(休眠)线程,我认为这些线程来自驱动程序。那些人数是~600。显然,数据库存在一些连接问题,在mongod重启后一段时间后确实恢复了。
MongoDB Java驱动程序版本是2.10.1 MongoDB版本是2.2.0
这可能是什么原因以及我应该做错什么导致它作为MongoDB的客户端应用程序?
答案 0 :(得分:4)
如果在适当的时间没有调用MongoClient.close(),有时会看到很多这些清理线程。
例如:
最初有一些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;
}
似乎工作得很好。