0

我的 java 代码使用 com.mongodb.DB 的单个实例连接到 mongo DB。现在我使用这个数据库实例来跨越 500 个对我的数据库执行命令的线程。所有这些都同时并行运行。以下是配置参数:

autoConnectRetry = true; 
connectionsPerHost=50; 
threadsAllowedToBlockForConnectionMultiplier=800; 
connectTimeout=20000; 
socketTimeout=60000; 
maxWaitTime=2000;

现在,如果我使用“db.serverStatus().connections”检查我的数据库,我会得到以下结果:“current”:52,“available”:19999,“totalCreated”:NumberLong(3681)....我...

我已经编写了这样的代码,即使在所有线程都完成后,我的主类仍然在循环中运行,因此我的 JVM 仍然处于启动状态。但我看到,在我停止我的 JVM 之前,所有这 52 个连接仍然处于活动状态。现在我再次执行相同的程序,他又占用了 50 个。一旦对 db 的执行结束,我怎样才能释放连接。是否非常有必要停止 JVM 以释放它们。此外,我认为 close() 不是调用每个线程的好选择,因为我必须从头开始为每个线程创建一个连接..

如果这是我的基于应用服务器的应用程序,那么数字可能永远不会减少,因为 JVM 不会在 db 调用后停止。

请帮忙..

4

1 回答 1

0

目前,Java 驱动程序只会在应用程序退出或 MongoClient 关闭时释放/关闭连接。

有一个 Jira 票证 ( JAVA-424 ) 可以随着时间的推移缩小连接池。目前正在开发的 3.0 版本中已经修复。

通常,MongoDB 在大量连接(数千个)方面没有问题,因此即使运行 50 或 100 个应用程序实例也不应该成为问题。

我不知道为什么你有主循环保持应用程序运行,但也许它可以检测工作线程何时完成并关闭 MongoClient 并在有更多工作要做时重新创建它?

HTH,罗伯

于 2013-09-14T00:38:41.547 回答