不知何故,我与 mongodb 交谈的 java 应用程序最终得到了大量名为 MongoCleanerXXX 的停放(休眠)线程,我认为这些线程来自驱动程序。其中的数量约为600。显然,在重新启动 mongod 一段时间后,数据库确实存在一些连接问题。
MongoDB Java 驱动版本是 2.10.1 MongoDB 版本是 2.2.0
这可能是什么原因以及我应该做错什么才能导致它作为 MongoDB 的客户端应用程序?
不知何故,我与 mongodb 交谈的 java 应用程序最终得到了大量名为 MongoCleanerXXX 的停放(休眠)线程,我认为这些线程来自驱动程序。其中的数量约为600。显然,在重新启动 mongod 一段时间后,数据库确实存在一些连接问题。
MongoDB Java 驱动版本是 2.10.1 MongoDB 版本是 2.2.0
这可能是什么原因以及我应该做错什么才能导致它作为 MongoDB 的客户端应用程序?
如果没有在适当的时间调用 MongoClient.close(),有时我们会看到很多这样的清理线程。
例如:
最初清理这些线程时存在一些竞争条件,但这已在 Java 驱动程序的 2.6 版中得到修复。
请参阅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;
}
似乎工作得很好。