java.net.SocketException:没有可用的缓冲区空间(达到最大连接数?):连接MongoDB JAVA API驱动程序

时间:2014-01-27 09:12:56

标签: 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的每个打开连接这一事实相关的原因。

2 个答案:

答案 0 :(得分:3)

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

修复方法是修改代码,以便在完成后关闭所有连接。建议的方法是:

  • Java 7及更高版本 - 使用“try with resource”

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


您的应用程序也可能尝试同时向MongoDB发送过多请求;即有一大堆请求线程。如果你这样做......不要。

答案 1 :(得分:0)

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