当前位置: 首页 > 知识库问答 >
问题:

如何获得MongoDB的可用(和免费)连接数(从客户端的角度)?

南门茂才
2023-03-14

我把这个问题贴在这里只是为了确保我没有在错误的树上吠叫。

如何获得使用(和免费)到MongoDB的连接数,但从客户端的角度(例如Java客户端),使用4. x驱动程序?

有关于使用serverStatus的帖子(使用java获取mongoDB中打开的连接数),但它假定对mongoDB具有“admin”访问权限。使用“普通用户”(具有较低权限(例如仅访问一个数据库)的db用户)无法运行serverStatus()。但这只提供了服务器端的视图(有N个来自IP x的连接)。

其他帖子提到了如何设置连接池大小(例如,使用MongoClients.create​(MongoClientSettings设置)(请参阅4.x API参考(https://mongodb.github.io/mongo-java-driver/4.0/apidocs/mongodb-driver-sync/com/mongodb/client/MongoClients.html)):

        MongoCredential credential = MongoCredential.createCredential(
                    username,
                    "admin",
                    password.toCharArray());

        MongoClient mongoClient = MongoClients.create(MongoClientSettings.builder()
                .applyToClusterSettings(
                        builder -> builder.hosts(Arrays.asList(new ServerAddress(hostname, portNumber))))
                .credential(credential)
                .applyToConnectionPoolSettings(builder -> builder
                                                                .minSize(connectionPoolMinimumSize)
                                                                .maxSize(connectionPoolMaximumSize))
                .readConcern(readConcern)
                .readPreference(readPreference)
                .writeConcern(writeConcern)
                .build());

但没有一个提供了将已使用和可用的连接从连接池中获取的方法。

正如Oleg提到的,使用ConnectionPoolListener是一种方法,但这只在3. x驱动程序中可用。ConnectionPoolListener方法在4. x上被标记为已弃用(尽管在JMX监控部分(html" target="_blank">http://mongodb.github.io/mongo-java-driver/4.0/driver-reactive/reference/monitoring/)中仍然提到了它。

共有2个答案

端木元青
2023-03-14

终于有了效果:

  • 创建了一个自定义连接池侦听器,实现了com.mongodb.event.ConnectionPoolListener...
    public class CustomConnectionPoolListener implements ConnectionPoolListener {
        ...
    }
  • 。。。以及在商店中更新统计数据计数器(稍后可访问)
        @Override
        public void connectionCreated(ConnectionCreatedEvent event) {
            ConnectionPoolStatsPOJO cps = mongoConnectionPoolList.get(connectionPoolAlias);
            cps.incrementConnectionsCreated();
            mongoConnectionPoolList.put(connectionPoolAlias, cps);
        }
  • 已将此自定义连接池侦听器附加到MongoClient连接:
ConnectionPoolListener customConnPoolListener = new CustomConnectionPoolListener(...); /* added some references in the */
    ...
    MongoClientSettings mongoClientSettings = MongoClientSettings.builder()
                .applicationName(applicationName)
                .applyConnectionString(connURI)
                .credential(credential)
                .readConcern(readConcern)
                .readPreference(readPreference)
                .writeConcern(writeConcern)
                .applyToConnectionPoolSettings(builder -> builder
                        .minSize(connectionPoolMinimumSize)
                        .maxSize(connectionPoolMaximumSize)
                        .addConnectionPoolListener(customConnPoolListener)
                )
                .retryWrites(true)
                .retryReads(true)
                .build();
    ...
    MongoClient mongoClient = MongoClients.create(mongoClientSettings);
    ....
  • 最后,要访问连接池统计数据,只需查询存储:
        ConnectionPoolStatsPOJO connectionPoolStats = MongoDB_ConnectionPool_Repository.getInstance().getMongoConnectionPoolList().get(connectionPoolAlias);

因此,感谢“@D.SM”为我们指明了正确的方向。

穆鸿飞
2023-03-14

您可以使用此处描述的连接池监视来跟踪连接状态,并推断您要查找的计数。

我不知道Java驱动程序是否将您正在寻找的计数器公开为公共API;许多驱动程序没有。

 类似资料:
  • 问题内容: 一切工作正常,但问题是当我在地图上定位时什么都没发生我注册了我的谷歌地图,我在这里做了所有说明 http://code.google.com/intl/pl/android/add-ons/google- apis/mapkey.html 我可以看到地图,可以放大和缩小,但是当我搜索位置时,会在logcat中找到它 这是我的Java代码 有什么帮助吗?提前致谢 问题答案: 如果您在AP

  • 问题内容: 我想知道我们如何知道套接字(java)中服务器端客户端的IP地址。假设有一个服务器“ S”和两个客户端“ A”和“ B”。客户端A向我(服务器)发送一些信息,客户端B向我(服务器)发送一些其他信息。我必须将来自A和B的信息存储在不同表中的数据库中。如何区分客户端A和客户端B的请求? 问题答案: 每个套接字都有一个方法来返回与其连接的客户端的IP地址。

  • 我们的用例是提出大量请求。每个请求返回1MB的数据。现在,在客户端,我们创建一个GRPC通道,并在循环中运行以下函数 我的问题是在python中如何创建grpc客户端连接池以获得更好的吞吐量? 在golang我看到了这个https://godoc.org/google.golang.org/api/option#WithGRPCConnectionPool但是我很难在python中找到文档。 py

  • 我知道这是一个类似于:Spring Integration的问题。未知主机和tcp-connection-factory 但是,在我的特殊情况下,TCP-连接是基于si消息流建立的。我正在编写一个程序,“伪造”用户登录到一个特定的网站通过TCP/IP连接。主机/端口每周都会发生变化,所以我更喜欢动态设置连接。因此,目标服务器的那些主机/IP不是静态的。 我知道我的用例很少,但它在我特定的业务逻辑中

  • 当我用我的节点运行MongoDB连接时。js应用程序哪个游戏平台我在这里面临着越来越多的MongoDB连接的问题[不使用任何查询,但它不断增加],达到819,我的MongoDB复制服务器停止响应,间接应用程序停止工作。但是我想保持至少20个关于如何解决这些问题的联系,请帮助我。 ** Mongodb连接:const connectionString=mongodb://AAAA:PASSWORD@

  • 完整代码: 完整日志: 附加到dockerfolder_mongodb_1,dockerfolder_docker_flask_mongo_1 mongodb_1 2018-08-27t13:14:18.349+0000 I控件[initandlisten]MongoDB开始:pid=1 port=27017 dbpath=/data/db 64位主机=E086871a3aeb mongodb_1