Spring使用MongoDatabaseFactory如何配置Mongo客户端超时等参数?
多MongoDB实例连接时配置MongoClient参数的方案
我正在开发一个Spring服务项目,需要连接多个MongoDB实例。为实现多库连接能力,我创建了MongoDatabaseFactory配置类对应每个连接,但目前出现随机的Mongo SSL超时错误。此前单库连接时会自定义MongoClient的各项参数(如连接池、Socket设置、CodecRegistry等),但使用SimpleMongoClientDatabaseFactory的方式不知道如何复用这些配置。
核心解决思路
不要直接通过ConnectionString构造SimpleMongoClientDatabaseFactory,而是先为每个MongoDB实例创建自定义配置的MongoClient,再基于该客户端构建MongoDatabaseFactory,这样就能完全复用单库时的参数配置逻辑。
步骤1:提取通用MongoClient配置工具类
将单库时的配置逻辑抽成通用工具方法,方便多实例复用:
import org.bson.UuidRepresentation; import org.bson.codecs.configuration.CodecRegistries; import org.bson.codecs.configuration.CodecRegistry; import org.bson.codecs.pojo.PojoCodecProvider; import com.mongodb.ConnectionString; import com.mongodb.MongoClientSettings; import com.mongodb.client.MongoClients; import com.mongodb.client.MongoClient; import java.util.concurrent.TimeUnit; public class MongoClientConfigUtils { public static MongoClient createCustomMongoClient(String connectionString) { // 配置POJO序列化CodecRegistry CodecRegistry pojoCodecRegistry = CodecRegistries.fromProviders(PojoCodecProvider.builder().automatic(true).build()); CodecRegistry codecRegistry = CodecRegistries.fromRegistries(MongoClientSettings.getDefaultCodecRegistry(), pojoCodecRegistry); return MongoClients.create(MongoClientSettings.builder() .applyConnectionString(new ConnectionString(connectionString)) .uuidRepresentation(UuidRepresentation.STANDARD) .codecRegistry(codecRegistry) // 连接池参数配置 .applyToConnectionPoolSettings(builder -> { builder.maxSize(300) .minSize(100) .maxConnectionLifeTime(300, TimeUnit.MILLISECONDS) .maintenanceFrequency(5000, TimeUnit.MILLISECONDS) .maxConnectionIdleTime(200, TimeUnit.MILLISECONDS) .maxWaitTime(150, TimeUnit.MILLISECONDS); }) // Socket超时配置(解决SSL随机超时关键) .applyToSocketSettings(builder -> { builder.connectTimeout(2000, TimeUnit.MILLISECONDS) .readTimeout(5500, TimeUnit.MILLISECONDS); }) .applicationName("TestApplication") .retryWrites(true) .build()); } }
步骤2:修改多库配置类,使用自定义MongoClient
针对每个MongoDB实例的配置类,基于自定义MongoClient构建MongoDatabaseFactory和MongoTemplate:
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.core.env.Environment; import org.springframework.data.mongodb.core.MongoTemplate; import org.springframework.data.mongodb.core.SimpleMongoClientDatabaseFactory; import org.springframework.data.mongodb.core.convert.MongoCustomConversions; import com.mongodb.ConnectionString; import com.mongodb.client.MongoClient; import java.math.BigDecimal; import java.util.Arrays; import org.bson.Decimal128; import org.springframework.core.convert.converter.Converter; import org.springframework.lang.NonNull; @Configuration public class UserProfileInformationMongoConfig { @Autowired private Environment env; @Bean public MongoClient userProfileInformationMongoClient() { String connectionString = env.getProperty("spring.data.mongo.userprofileinformationdb.uri"); return MongoClientConfigUtils.createCustomMongoClient(connectionString); } @Bean public SimpleMongoClientDatabaseFactory userProfileInformationFactory() { String connectionString = env.getProperty("spring.data.mongo.userprofileinformationdb.uri"); String dbName = new ConnectionString(connectionString).getDatabase(); return new SimpleMongoClientDatabaseFactory(userProfileInformationMongoClient(), dbName); } @Bean public MongoTemplate userProfileInformationMongoTemplate() { MongoTemplate template = new MongoTemplate(userProfileInformationFactory()); // 配置自定义转换器 template.setCustomConversions(mongoCustomConversions()); return template; } @Bean public MongoCustomConversions mongoCustomConversions() { return new MongoCustomConversions(Arrays.asList( new BigDecimalDecimal128Converter(), new Decimal128BigDecimalConverter() )); } @WritingConverter private static class BigDecimalDecimal128Converter implements Converter<BigDecimal, Decimal128> { @Override public Decimal128 convert(@NonNull BigDecimal source) { return new Decimal128(source); } } @ReadingConverter private static class Decimal128BigDecimalConverter implements Converter<Decimal128, BigDecimal> { @Override public BigDecimal convert(@NonNull Decimal128 source) { return source.bigDecimalValue(); } } }
关键说明
- 每个MongoDB实例对应独立的MongoClient,确保自定义的连接池、超时等参数完全生效,从根源解决随机SSL超时问题。
- 通用配置抽离后,新增其他MongoDB实例的配置时直接复用工具类即可,避免重复代码。
- 如果需要全局共享自定义转换器,可将
MongoCustomConversions定义为独立的全局Bean,无需在每个配置类中重复定义。
内容的提问来源于stack exchange,提问作者MetaCoder
相关产品推荐
相关产品推荐

