【问题标题】:Mongo Driver current connectionMongo Driver 当前连接
【发布时间】:2013-09-13 13:50:28
【问题描述】:

我的 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 调用后不会停止。

请帮忙..

【问题讨论】:

    标签: mongodb


    【解决方案1】:

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

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

    一般来说,MongoDB 的大量连接(数千个)没有问题,因此即使运行 50 或 100 个应用程序实例也不应该成为问题。

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

    HTH, 抢

    【讨论】:

    • 感谢 Rob。如果 mongo 直到应用程序退出才释放连接,这意味着在我的实时服务器部署中,当前连接数将继续堆积,因为我的应用程序不会停止很长时间。这不会导致我打开大量连接的情况,其中大多数连接已经完成,但由于应用程序没有停止而没有释放。是否可以在每个数据库事务后关闭连接。每次创建客户端连接的开销是多少
    • 如果您有一个服务器应用程序随着时间的推移接收更多请求/工作,并且它使用单个 MongoClient 处理所有这些请求,那么该应用程序实例将仅打开 50 个连接并将它们重用于应用程序的生命周期。如果应用程序在 cron 上处理批处理/终止,并且一次运行多个批处理,那么您可能可以减少与 MongoDB 的连接数,因为我怀疑这不是限制因素。您能否就您的应用程序如何工作以及如何与 MongoDB 交互的问题添加更多细节?
    • 我的应用程序在 HA 服务器中运行,总共至少有 16 个 JVM。对于每个 maxConnToHost = 100,这些 JVM 中的每一个都将访问我的数据库。现在我所有的 JVM 总共将有 (16*100)1600 个与数据库的连接。这不是很重吗?我看到一个带有 mongo 的选项 maxIdleTimeMS,我认为它可以清除未使用的连接,但找不到用我的 java 驱动程序设置它的方法。我使用的是 2.11.2 版本
    • 我有时会在 2013 年 9 月 19 日上午 12:07:08 com.mongodb.DBPortPool gotError 警告:清空 DBPortPool 到 localhost/127.0.0.1:27017 b/c 错误 java。 net.SocketException:在 java.io.BufferedInputStream.fill(Unknown Source) 处的 java.net.SocketInputStream.read(Unknown Source) 处的 java.net.SocketInputStream.read(Unknown Source) 处的连接重置
    • 1600 不是很多。我的服务器处理的不仅仅是操作。如果您不需要它们,您始终可以减少每个 JVM 的最大连接数。当出现暂时性错误时,异常是“正常的”。 maxIdleTimeMS 仅在 3.0.0 中受支持(据我所知)。
    猜你喜欢
    • 2019-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-09
    • 2019-09-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多