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/