【问题标题】:Endless MongoDB ReplicaSetStatus updater exceptions using the Java driver in Spring在 Spring 中使用 Java 驱动程序的无尽 MongoDB ReplicaSetStatus 更新程序异常
【发布时间】:2023-03-21 01:15:01
【问题描述】:

我刚刚在 Glassfish 上部署了一个 Spring Web 应用程序。 这个应用程序包含一个为 Mongo 对象注入的 Spring bean,这是非常基本的,它看起来像这样:

<bean id="mongo" class="com.mongodb.Mongo">
    <constructor-arg value="127.0.0.1" />
    <constructor-arg value="27017" />
</bean>

我启动了我的网络应用程序,然后使用这个 Mongo 对象来查询数据库并插入记录等等……一切正常。

但是在我的 server.log 文件中,我得到了无穷无尽的SEVERE 错误消息。他们是NullPointerExceptions 和IOExceptions。貌似跟ReplicaSetStatus有关,不知道为什么一直在尝试连接,是不是默认开启?

有人知道是什么原因造成的吗? 我怎样才能解决问题,或停止导致问题的原因?

// 编辑: 在我部署我的应用程序后,异常立即开始。但是当我禁用我的应用程序时,它们并没有停止,甚至取消部署它。

这些消息只是不断写入,但据我所知,只有 4 种类型的错误:

[#|2011-04-22T17:49:40.818+0900|SEVERE|glassfish3.1|com.mongodb.ReplicaSetStatus|_ThreadID=37;_ThreadName=Thread-1;|can't update node: 27017:27017
java.lang.NullPointerException
    at com.mongodb.OutMessage.reset(OutMessage.java:73)
    at com.mongodb.OutMessage.<init>(OutMessage.java:51)
    at com.mongodb.OutMessage.query(OutMessage.java:38)
    at com.mongodb.DBPort.findOne(DBPort.java:127)
    at com.mongodb.DBPort.runCommand(DBPort.java:138)
    at com.mongodb.ReplicaSetStatus$Node.update(ReplicaSetStatus.java:149)
    at com.mongodb..updateAll(ReplicaSetStatus.java:314)
    at com.mongodb.ReplicaSetStatus$Updater.run(ReplicaSetStatus.java:263)
|#]

[#|2011-04-22T17:49:40.818+0900|SEVERE|glassfish3.1|com.mongodb.ReplicaSetStatus|_ThreadID=37;_ThreadName=Thread-1;|can't update node: localhost:27017
java.lang.NullPointerException
    at com.mongodb.OutMessage.reset(OutMessage.java:73)
    at com.mongodb.OutMessage.<init>(OutMessage.java:51)
    at com.mongodb.OutMessage.query(OutMessage.java:38)
    at com.mongodb.DBPort.findOne(DBPort.java:127)
    at com.mongodb.DBPort.runCommand(DBPort.java:138)
    at com.mongodb.ReplicaSetStatus$Node.update(ReplicaSetStatus.java:149)
    at com.mongodb.ReplicaSetStatus.updateAll(ReplicaSetStatus.java:314)
    at com.mongodb.ReplicaSetStatus.ensureMaster(ReplicaSetStatus.java:306)
    at com.mongodb.DBTCPConnector.checkMaster(DBTCPConnector.java:383)
    at com.mongodb.ReplicaSetStatus$Updater.run(ReplicaSetStatus.java:275)
|#]

[#|2011-04-22T17:49:41.676+0900|SEVERE|glassfish3.1|com.mongodb.ReplicaSetStatus|_ThreadID=48;_ThreadName=Thread-1;|can't update node: 127.0.0.1:27017
java.io.IOException: couldn't connect to [/127.0.0.1:27017] bc:java.net.ConnectException: Connection refused: connect
    at com.mongodb.DBPort._open(DBPort.java:206)
    at com.mongodb.DBPort.go(DBPort.java:94)
    at com.mongodb.DBPort.go(DBPort.java:75)
    at com.mongodb.DBPort.findOne(DBPort.java:129)
    at com.mongodb.DBPort.runCommand(DBPort.java:138)
    at com.mongodb.ReplicaSetStatus$Node.update(ReplicaSetStatus.java:149)
    at com.mongodb.ReplicaSetStatus.updateAll(ReplicaSetStatus.java:314)
    at com.mongodb.ReplicaSetStatus.ensureMaster(ReplicaSetStatus.java:306)
    at com.mongodb.DBTCPConnector.checkMaster(DBTCPConnector.java:383)
    at com.mongodb.ReplicaSetStatus$Updater.run(ReplicaSetStatus.java:275)
|#]

[#|2011-04-22T17:49:41.676+0900|SEVERE|glassfish3.1|com.mongodb.ReplicaSetStatus|_ThreadID=48;_ThreadName=Thread-1;|can't update node: 27017:27017
java.io.IOException: couldn't connect to [/0.0.105.137:27017] bc:java.net.SocketException: Network is unreachable: connect
    at com.mongodb.DBPort._open(DBPort.java:206)
    at com.mongodb.DBPort.go(DBPort.java:94)
    at com.mongodb.DBPort.go(DBPort.java:75)
    at com.mongodb.DBPort.findOne(DBPort.java:129)
    at com.mongodb.DBPort.runCommand(DBPort.java:138)
    at com.mongodb.ReplicaSetStatus$Node.update(ReplicaSetStatus.java:149)
    at com.mongodb.ReplicaSetStatus.updateAll(ReplicaSetStatus.java:314)
    at com.mongodb.ReplicaSetStatus.ensureMaster(ReplicaSetStatus.java:306)
    at com.mongodb.DBTCPConnector.checkMaster(DBTCPConnector.java:383)
    at com.mongodb.ReplicaSetStatus$Updater.run(ReplicaSetStatus.java:275)
|#]

【问题讨论】:

  • 您是在运行 Mongo 集群还是仅在本地主机上运行 1 个节点?你能粘贴你用来启动节点的mongod命令吗?
  • 我想我只有一个节点。我在 Windows7 上本地运行测试副本。我只需双击 mongod.exe 即可启动 mongdb
  • 嗯..不幸的是我对Windows一无所知:(你能通过命令行客户端连接到mongo服务器吗?应该是mongo.exe。
  • 我很难相信,但看起来你正在运行带有 --replSet 选项的 mongod 以将此节点配置为副本集的一部分。
  • 是的,它可以很好地连接并且可以从命令行正常工作,也可以从 Java 内部正常工作。我只是担心,因为不断尝试连接可能不适合我的应用服务器。

标签: java spring mongodb glassfish


【解决方案1】:

在 Spring 上下文文件中更改您的 Mongo bean 定义,如下所示:

    <constructor-arg value="${db.host}" type="java.lang.String" />
    <constructor-arg value="${db.port}" type="int" />

如果省略 type 属性,则会调用另一个 Mongo 类构造函数,其中参数是 com.mongodb.ServerAddress 类型的实例,并且 27017 被视为主机名和InetAddress.getAllByName(host) 解析到这个 IP 0.0.105.137

【讨论】:

  • 实际上事实证明这确实有效 =) 我刚刚破坏了我的构建,因此没有部署新的 WAR 文件。阿里加图!
猜你喜欢
  • 2016-03-13
  • 1970-01-01
  • 2016-06-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多