Spring Boot应用配置远程MongoDB后仍尝试连接localhost:27017的原因排查
问题根源与解决方案
你遇到的这个问题核心原因很清晰:你的应用同时存在两套MongoDB连接逻辑,其中手动创建MongoTemplate的代码没有复用配置文件里的远程MongoDB参数,而是使用了默认的本地连接配置。
具体分析
- 已生效的远程连接:从日志中的
Monitor thread successfully connected to server with description ServerDescription{address=35.182.107.168:51828...}可以确认,Spring Boot已经通过你配置的spring.data.mongodb.*参数成功连接到了远程EC2上的MongoDB服务,这部分是正常的。 - 触发本地连接的代码:问题出在你手动创建
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
相关产品推荐
相关产品推荐

