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的每个打开连接这一事实相关的原因。
答案 0 :(得分:3)
我怀疑问题是你的应用程序正在“泄漏”连接;即它打开了许多与MongoDB服务器的连接而忽略了关闭它们。这导致某些东西(操作系统内核?)用完了缓冲区空间。
修复方法是修改代码,以便在完成后关闭所有连接。建议的方法是:
Java 7及更高版本 - 使用“try with resource”
Java 6及更早版本 - 使用“try ... finally”并显式关闭finally块中的资源。
您的应用程序也可能尝试同时向MongoDB发送过多请求;即有一大堆请求线程。如果你这样做......不要。
答案 1 :(得分:0)
连接发送数据将使用直接内存。如果您创建的连接不是太多,也许您可以使用-XX:MaxDirectMemorySize =来设置最大直接内存大小。如果它不起作用,您可以检查并释放连接数,并在使用后关闭它们。