【问题标题】:MongoSocketOpenException - trouble with connecting to MongoDBMongoSocketOpenException - 连接到 MongoDB 时遇到问题
【发布时间】:2017-08-03 14:34:18
【问题描述】:

这是我第一次尝试使用 MongoDB,所以如果你们有任何提示,我会很高兴,但特别是,我无法建立连接...当 jar 加载时会发生此错误。

这是我的堆栈跟踪:

[00:12:43 INFO]: Exception in monitor thread while connecting to server 127.0.0.1:27017
com.mongodb.MongoSocketOpenException: Exception opening socket
    at com.mongodb.connection.SocketStream.open(SocketStream.java:63) ~[GangWars-1.0-SNAPSHOT-shaded.jar:?]
    at com.mongodb.connection.InternalStreamConnection.open(InternalStreamConnection.java:115) ~[GangWars-1.0-SNAPSHOT-shaded.jar:?]
    at com.mongodb.connection.DefaultServerMonitor$ServerMonitorRunnable.run(DefaultServerMonitor.java:113) [GangWars-1.0-SNAPSHOT-shaded.jar:?]
    at java.lang.Thread.run(Unknown Source) [?:1.8.0_91]
Caused by: java.net.ConnectException: Connection refused: connect
    at java.net.DualStackPlainSocketImpl.waitForConnect(Native Method) ~[?:1.8.0_91]
    at java.net.DualStackPlainSocketImpl.socketConnect(Unknown Source) ~[?:1.8.0_91]
    at java.net.AbstractPlainSocketImpl.doConnect(Unknown Source) ~[?:1.8.0_91]
    at java.net.AbstractPlainSocketImpl.connectToAddress(Unknown Source) ~[?:1.8.0_91]
    at java.net.AbstractPlainSocketImpl.connect(Unknown Source) ~[?:1.8.0_91]
    at java.net.PlainSocketImpl.connect(Unknown Source) ~[?:1.8.0_91]
    at java.net.SocksSocketImpl.connect(Unknown Source) ~[?:1.8.0_91]
    at java.net.Socket.connect(Unknown Source) ~[?:1.8.0_91]
    at com.mongodb.connection.SocketStreamHelper.initialize(SocketStreamHelper.java:57) ~[GangWars-1.0-SNAPSHOT-shaded.jar:?]
    at com.mongodb.connection.SocketStream.open(SocketStream.java:58) ~[GangWars-1.0-SNAPSHOT-shaded.jar:?]
    ... 3 more

这是我的代码(当 jar 运行时立即发生):

private void loadGangs() {
    MongoDB.getIDs().forEach(id -> GangUtils.addGang(new Gang(id)));
}

我的 MongoDB 课程:

public final class MongoDB {

private static final String name = "data";
private static final MongoClient mongoClient = new MongoClient();

public static String getName() {
    return name;
}

public static MongoDatabase getDatabase() {
    return mongoClient.getDatabase(name);
}

public enum CollectionEnum {
    GANG, DRUGS, COPS
}

public static MongoCollection<Document> getCollection(CollectionEnum collection) {
    return getDatabase().getCollection(collection.name().toLowerCase());
}

public static List<Integer> getIDs() {
    List<Document> gangs = getCollection(CollectionEnum.GANG).find().into(new ArrayList<>());
    List<Integer> ids = new ArrayList<>();

    for (Document gang : gangs) {
        Object object = gang.get("_id");

        if (!(object instanceof Document)) continue;

        List<Document> idTags = (List<Document>) object;

        for (Document id : idTags) {
            ids.add(id.getInteger("_id"));
        }

    }

    return ids;
}

public static int getNextID() {
    int id = 0;
    for (int i = 0; i >= getIDs().size(); i++) {
        if (getIDs().get(i) != i) {
            id = i;
            break;
        }
        id++;
    }
    return id;
}

}

我做错了什么? (我尝试在这里进行研究,但找不到任何与 Java 相关的内容来帮助我使用 MongoDB)

【问题讨论】:

  • 如果您使用Linux,您使用的操作系统是什么尝试诊断mongodb的27017端口是否已打开,即,您可以使用命令mongo连接到mongodb吗?
  • 使用 Windows 10。
  • 检查答案以获得诊断端口27017是否以telnet打开的方法。没有用手拿到窗户。

标签: java mongodb connection


【解决方案1】:

我知道这篇文章是 9 个月,但这可以帮助其他人。 我遇到了同样的问题:问题是我不幸地将test 作为scope 用于de.flapdoodle.embed.mongo 依赖项,只需通过评论scope 将其设为默认值(compile)即可解决问题。

<dependency>
   <groupId>de.flapdoodle.embed</groupId>
   <artifactId>de.flapdoodle.embed.mongo</artifactId>
    <!-- <scope>test</scope>  -->
</dependency>

compile 是 maven 默认范围。构建、测试和运行项目需要具有compile 范围的依赖项。 构建和运行项目不需要test 范围的依赖项,而是编译和运行单元测试。 因此,以test 为范围的依赖项将不会附加到构建过程的jar/war 结果,并且在我们运行项目时,包含的类和其他资源不可用。
see here for more information about maven scopes

【讨论】:

  • 请补充为什么这样的改变解决了你的错误? @Meziane
  • @deckno 你来了。
【解决方案2】:

您的 MongoDB 实例似乎未正确启动, 您可以通过直接运行命令mongo 进行诊断 或者,如果您使用的是 Linux 发行版,则可以使用 nc -zv localhost 27017

如果你使用的是windows,可以尝试运行telnet 127.0.0.1 27017查看端口是否打开,注意telent命令默认不会启用,要启用需要到软件中的控制面板和服务,启用 telnet 客户端。作为开发人员,您应该始终启用它,以诊断一些网络问题。

此外,还有一个我们发现非常有用的 ORM 驱动程序,并且已经投入生产环境多年,它包装了由官方供应商维护的默认 MongoDB-java-driver,称为 morphia

【讨论】:

    猜你喜欢
    • 2020-10-01
    • 2022-12-07
    • 1970-01-01
    • 1970-01-01
    • 2022-11-04
    • 2022-11-18
    • 2022-07-14
    • 2020-12-11
    • 2011-07-13
    相关资源
    最近更新 更多