我的java代码使用com.mongodb.DB的单个实例连接到mongo DB。现在我使用这个db实例来跨越500个执行命令到我的db的线程。所有这些都同时并行运行。以下是conf params:
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()是调用每个线程的好选择,因为我将不得不从头开始为每个线程创建一个连接..
如果这是我的基于应用服务器的应用程序,那么数字永远不会减少,因为在调用db后JVM不会停止。
请帮助..
答案 0 :(得分:0)
目前,Java驱动程序仅在应用程序退出或MongoClient关闭时才释放/关闭连接。
有一个Jira票证(JAVA-424)可以随时间缩小连接池。它已经在目前正在开发的3.0版本中得到修复。
通常,MongoDB没有大量连接(数千个)的问题,因此即使运行50或100个应用程序实例也不会成为问题。
我不确定为什么你有主循环保持应用程序运行但是它可以检测工作线程何时完成并关闭MongoClient并在有更多工作要做之后重新创建它?
HTH, 罗布