【问题标题】:java.net.SocketException: No buffer space available (maximum connections reached?): connect MongoDB JAVA API Driverjava.net.SocketException:没有可用的缓冲区空间(达到最大连接数?):连接 MongoDB JAVA API 驱动程序
【发布时间】:2015-04-17 22:47:43
【问题描述】:

有一个 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)

如果有人能说出它为什么会发生以及如何防止它,我会很高兴。我在想,原因与每个打开的到 mongoDB 封装在 MongoClient 对象中的连接都应该关闭有关。

【问题讨论】:

  • 你能粘贴源代码吗?
  • 您有多少连接打开/可用?您可以通过db.serverStatus().connections查看。

标签: java mongodb


【解决方案1】:

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

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

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

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


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

【讨论】:

    【解决方案2】:

    连接发送数据将使用直接内存。如果您创建的连接不是太多,也许您可​​以使用 -XX:MaxDirectMemorySize= 来设置最大直接内存大小。如果还是不行,可以检查释放连接数,使用后关闭。

    【讨论】:

      猜你喜欢
      • 2011-08-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多