java - Java Mongo 驱动程序无意间连接到 localhost
问题描述
我下载了 java 的 mongo 驱动程序(mongo-java-driver-3.12.4.jar)并将 MongoClient 连接到远程主机。
与远程主机的连接成功建立。但除了这个预期的连接之外,我在日志中有错误消息表明驱动程序尝试连接到没有运行 mongo db 的本地主机:
09:52:52,082 INFO [org.mongodb.driver.cluster] (default task-1) Cluster created with settings {hosts=[127.0.0.1:27017], mode=SINGLE, requiredClusterType=UNKNOWN, serverSelectionTimeout='30000 ms', maxWaitQueueSize=500}
09:52:52,843 INFO [org.mongodb.driver.cluster] (default task-1) Cluster created with settings {hosts=[remoteHost:27017], mode=SINGLE, requiredClusterType=UNKNOWN, serverSelectionTimeout='30000 ms', maxWaitQueueSize=500}
09:52:52,879 INFO [org.mongodb.driver.cluster] (default task-1) Cluster description not yet available. Waiting for 30000 ms before timing out
09:52:53,159 INFO [org.mongodb.driver.connection] (cluster-ClusterId{value='5ef457d443933341aa40d5f3', description='null'}-remoteHost:27017) Opened connection [connectionId{localValue:2, serverValue:373}] to remoteHost:27017
09:52:53,219 INFO [org.mongodb.driver.cluster] (cluster-ClusterId{value='5ef457d443933341aa40d5f3', description='null'}-remoteHost:27017) Monitor thread successfully connected to server with description ServerDescription{address=remoteHost:27017, type=STANDALONE, state=CONNECTED, ok=true, version=ServerVersion{versionList=[3, 6, 18]}, minWireVersion=0, maxWireVersion=6, maxDocumentSize=16777216, logicalSessionTimeoutMinutes=30, roundTripTimeNanos=54329200}
09:52:53,707 INFO [org.mongodb.driver.connection] (default task-1) Opened connection [connectionId{localValue:3, serverValue:374}] to remoteHost:27017
09:52:54,198 INFO [org.mongodb.driver.cluster] (cluster-ClusterId{value='5ef457d443933341aa40d5f2', description='null'}-127.0.0.1:27017) Exception in monitor thread while connecting to server 127.0.0.1:27017: com.mongodb.MongoSocketOpenException: Exception opening socket
at com.mongodb.internal.connection.SocketStream.open(SocketStream.java:70)
at com.mongodb.internal.connection.InternalStreamConnection.open(InternalStreamConnection.java:128)
at com.mongodb.internal.connection.DefaultServerMonitor$ServerMonitorRunnable.run(DefaultServerMonitor.java:117)
at java.lang.Thread.run(Unknown Source)
Caused by: java.net.ConnectException: Connection refused: connect
at java.net.TwoStacksPlainSocketImpl.socketConnect(Native Method)
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.internal.connection.SocketStreamHelper.initialize(SocketStreamHelper.java:64)
at com.mongodb.internal.connection.SocketStream.initializeSocket(SocketStream.java:79)
at com.mongodb.internal.connection.SocketStream.open(SocketStream.java:65)
... 3 more
我MongoClient(ServerAddress addr, MongoCredential credential, MongoClientOptions options)
用来设置远程主机的连接设置。我从不使用 localhost 或 127.0.0.1。
驱动程序为什么会尝试连接到本地主机,更重要的是如何禁用此行为?:)
编辑:这是我初始化 MongoClient 的方式:
{
...
String connectionString = "mongodb://user:password@remoteHost:27017/";
MongoClientURI clientURI = new MongoClientURI(connectionString);
mongoClient = new MongoClient(createServerAddress(clientURI.getHosts().get(0)), clientURI.getCredentials(), addOptions(clientURI.getOptions()));
MongoDatabase db = mongoClient.getDatabase(dbName);
...
}
private ServerAddress createServerAddress(String host) {
if (host.contains(":")) {
String[] parts = host.split(":");
return new ServerAddress(parts[0], Integer.parseInt(parts[1]));
} else {
return new ServerAddress(host);
}
}
private MongoClientOptions addOptions(MongoClientOptions options) {
Builder builder = new Builder(options);
File ksFile = new File(config.getKeystorePath()));
char[] password = config.getKeystorePassword()).toCharArray();
if (ksFile.exists()) {
try {
KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType());
try (FileInputStream fis = new FileInputStream(ksFile)) {
ks.load(fis, password);
}
TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
tmf.init(ks);
SSLContext sslContext = SSLContext.getInstance("TLS");
sslContext.init(null, tmf.getTrustManagers(), null);
builder.sslEnabled(true);
builder.sslContext(sslContext);
} catch (Exception e) {
logger.error("TLS initialization failed: ", e.getCause());
}
}
return builder.build();
}
解决方案
推荐阅读
- python - Pycharm 检查 .idea 是否有效
- inno-setup - 在 Inno 设置中运行 Sql server 脚本以使用 cmd 更新数据库
- python - 求解具有 7 个未知数的线性联立方程
- javascript - 在 do while 循环中重复调用函数
- html - 如果在将 div 插入 DOM 后更改其样式,为什么转换不起作用?
- c++ - 使用 clang 10 for Visual Studio 2019 编译时不调用覆盖删除
- android - 如何使用 ACTION_OPEN_DOCUMENT_TREE 提示内容管理器选择器直接在可选位置打开
- sql - 从带有连接的表中获取记录,其中连接中的记录不包含特定值
- c# - 设置为脱机工作时如何在 Outlook 中读取/写入联系人和事件 - C#
- java - Instagram 的“代码”和“重定向网址”是什么?