You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot应用配置远程MongoDB后仍尝试连接localhost:27017的原因排查

问题根源与解决方案

你遇到的这个问题核心原因很清晰:你的应用同时存在两套MongoDB连接逻辑,其中手动创建MongoTemplate的代码没有复用配置文件里的远程MongoDB参数,而是使用了默认的本地连接配置。

具体分析

  1. 已生效的远程连接:从日志中的Monitor thread successfully connected to server with description ServerDescription{address=35.182.107.168:51828...}可以确认,Spring Boot已经通过你配置的spring.data.mongodb.*参数成功连接到了远程EC2上的MongoDB服务,这部分是正常的。
  2. 触发本地连接的代码:问题出在你手动创建MongoTemplate的代码行:
    mongoOps = new MongoTemplate(MongoClients.create(), "province");
    
    当你调用MongoClients.create()而不传任何参数时,MongoDB驱动会默认使用**mongodb://localhost:27017**作为连接字符串,尝试连接本地的MongoDB服务。但你的应用所在环境并没有启动本地MongoDB,所以抛出了Connection refused的异常,日志里的Cluster created with settings {hosts=[localhost:27017]}也印证了这一点。

解决方案

根据你的需求,有两种可行的解决方式:

方案1:使用Spring自动配置的MongoTemplate(推荐)

Spring Boot的spring-boot-starter-data-mongodb依赖会自动根据你application.properties里的配置创建MongoTemplate和MongoClient实例,你完全不需要手动创建。直接通过依赖注入使用即可:

@Autowired
private MongoOperations mongoOps; // 或者直接注入MongoTemplate类型

这样就能复用你配置的远程MongoDB连接,不会再出现本地连接的异常。

方案2:手动创建时复用配置参数

如果你确实需要手动构建MongoTemplate,一定要确保使用配置文件里的参数来创建MongoClient:

方式一:通过连接字符串构建

@Value("${spring.data.mongodb.host}")
private String mongoHost;

@Value("${spring.data.mongodb.port}")
private int mongoPort;

@Value("${spring.data.mongodb.database}")
private String mongoDb;

// 在需要初始化的方法中:
String connectionStr = String.format("mongodb://%s:%d", mongoHost, mongoPort);
mongoOps = new MongoTemplate(MongoClients.create(connectionStr), mongoDb);

方式二:通过MongoClientSettings构建(更灵活)

import com.mongodb.client.MongoClients;
import com.mongodb.client.MongoClient;
import org.springframework.data.mongodb.core.MongoTemplate;
import com.mongodb.ServerAddress;
import com.mongodb.MongoClientSettings;
import java.util.List;

@Value("${spring.data.mongodb.host}")
private String mongoHost;

@Value("${spring.data.mongodb.port}")
private int mongoPort;

@Value("${spring.data.mongodb.database}")
private String mongoDb;

// 构建连接配置
MongoClientSettings settings = MongoClientSettings.builder()
        .applyToClusterSettings(builder ->
                builder.hosts(List.of(new ServerAddress(mongoHost, mongoPort))))
        .build();

// 创建MongoClient和MongoTemplate
MongoClient mongoClient = MongoClients.create(settings);
mongoOps = new MongoTemplate(mongoClient, mongoDb);

验证修改效果

修改完成后重启应用,你会发现日志里不再出现Cluster created with settings {hosts=[localhost:27017]}的信息,同时Exception in monitor thread while connecting to server localhost:27017的异常也会消失,应用只会维护你配置的远程MongoDB连接。

内容的提问来源于stack exchange,提问作者conteh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 11:07:50