MongoDB Java驱动中如何为带codec的ClusterSettings设置URI
解决方案
你可以通过以下两种方式完成MongoDB URI的配置,同时注意原有代码的性能问题优化:
方式1:使用applyConnectionString(官方推荐,最简洁)
直接传入MongoDB连接字符串即可,无需单独配置ClusterSettings,是官方推荐的标准写法:
// 先确保你的MongodbConfiguration中已经配置了uri方法,返回类似mongodb://user:pass@host:port/db的连接串 ConnectionString connectionString = new ConnectionString(mongodbConfiguration.uri()); MongoClientSettings clientSettings = MongoClientSettings.builder() .applyConnectionString(connectionString) // 一行完成URI配置 .codecRegistry(codecRegistry) .addCommandListener(new MongoCommand()) .build();
方式2:通过applyToClusterSettings配置
如果你需要单独定制集群相关参数,可通过该方法配置:
ConnectionString connectionString = new ConnectionString(mongodbConfiguration.uri()); MongoClientSettings clientSettings = MongoClientSettings.builder() .applyToClusterSettings(builder -> builder.applyConnectionString(connectionString)) .codecRegistry(codecRegistry) .addCommandListener(new MongoCommand()) .build();
代码优化提示
MongoClient是重量级实例,内部已经实现了连接池管理,整个应用生命周期只需要初始化一次即可,不要每次调用getCollection方法都创建新的实例,否则会出现连接泄漏、性能下降的问题。优化后的完整代码示例如下:
@Singleton public record Repository(MongodbConfiguration mongodbConfiguration) implements IRepository { // 单例持有MongoClient,初始化时仅创建一次 private final MongoClient mongoClient = initMongoClient(); private MongoClient initMongoClient() { // 创建POJO序列化的codec注册表 CodecRegistry pojoCodecRegistry = fromProviders(PojoCodecProvider.builder().automatic(true).build()); CodecRegistry codecRegistry = fromRegistries(MongoClientSettings.getDefaultCodecRegistry(), pojoCodecRegistry); // 构造连接配置 ConnectionString connectionString = new ConnectionString(mongodbConfiguration.uri()); MongoClientSettings clientSettings = MongoClientSettings.builder() .applyConnectionString(connectionString) .codecRegistry(codecRegistry) .addCommandListener(new MongoCommand()) .build(); return MongoClients.create(clientSettings); } @Override public <T> MongoCollection<T> getCollection(String collectionName, Class<T> typeParameterClass) { return mongoClient .getDatabase(mongodbConfiguration.database()) .getCollection(collectionName, typeParameterClass); } }
内容的提问来源于stack exchange,提问作者San Jaisy
相关产品推荐
相关产品推荐

