java.net.SocketException : No buffer space available (maximum connections reached? ): 连接 MongoDB JAVA API 驱动程序

标签 java mongodb

MongoDB 副本集通过向其写入数据的线程定期连接。 一段时间后,我收到此错误。

WARNING: Server seen down: mongoServer:port - java.io.IOException - message: couldn't connect to [mongoServer:port] bc:java.net.SocketException: No buffer space available (maximum connections reached?): connect
ינו 26, 2014 10:29:57 PM com.mongodb.DBPort _open
INFO: connect fail to : mongoServer:port
java.net.SocketException: No buffer space available (maximum connections reached?): connect
    at java.net.DualStackPlainSocketImpl.connect0(Native Method)
    at java.net.DualStackPlainSocketImpl.socketConnect(Unknown Source)
    at java.net.AbstractPlainSocketImpl.doConnect(Unknown Source)
    at java.net.AbstractPlainSocketImpl.connectToAddress(Unknown Source)
    at java.net.AbstractPlainSocketImpl.connect(Unknown Source)
    at java.net.PlainSocketImpl.connect(Unknown Source)
    at java.net.SocksSocketImpl.connect(Unknown Source)
    at java.net.Socket.connect(Unknown Source)
    at com.mongodb.DBPort._open(DBPort.java:204)
    at com.mongodb.DBPort.go(DBPort.java:107)
    at com.mongodb.DBPort.go(DBPort.java:88)
    at com.mongodb.DBPort.findOne(DBPort.java:143)
    at com.mongodb.DBPort.runCommand(DBPort.java:148)
    at com.mongodb.ConnectionStatus$UpdatableNode.update(ConnectionStatus.java:184)
    at com.mongodb.ReplicaSetStatus$UpdatableReplicaSetNode.update(ReplicaSetStatus.java:612)
    at com.mongodb.ReplicaSetStatus$Updater.updateAll(ReplicaSetStatus.java:764)
    at com.mongodb.ReplicaSetStatus$Updater.run(ReplicaSetStatus.java:734)

如果有人能告诉我为什么会发生这种情况以及如何预防它,我会很高兴。我认为原因与封装在 MongoClient 对象中的每个打开的 mongoDB 连接都应该关闭有关。

最佳答案

我怀疑问题是您的应用程序“泄漏”连接;即,它打开了许多与 MongoDB 服务器的连接,却忽略了关闭它们。这导致某些东西(操作系统内核?)耗尽缓冲区空间。

修复方法是修改您的代码,以便所有连接在完成后都将关闭。推荐的方法是:

  • Java 7 及更高版本 - 使用“尝试使用资源”

  • Java 6 及更早版本 - 使用“try ...finally”并显式关闭finally block 中的资源。

<小时/>

您的应用程序也可能尝试同时向 MongoDB 发送太多请求;即具有大量请求线程。如果你正在这样做……不要这样做。

关于java.net.SocketException : No buffer space available (maximum connections reached? ): 连接 MongoDB JAVA API 驱动程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21376862/

相关文章:

mongodb - 如何在 mongodb 中查询过去六个月的日期

java - 外部服务触发异步任务并立即返回。如何判断任务何时真正完成?

java - 简单的纯java CSV读取和解析

java - Switch 语句在嵌套类型中失败

java - 如何使用扫描仪库并使用嵌入式扫描仪在 Android 应用程序的后台进行扫描?

mongodb - 如何在不提及字段名称的情况下在mongodb中搜索记录?

node.js - Mongoose - 如何防止 mongoose 在模型实例化时创建 _id

java - Retrofit 2 onResponse 方法从未被调用

sql - 在mongo中优先执行查询

MongoDB 在构建索引后插入文档?