12.SpringBoot3连接MongoDB多数据源

本文实践MongoDB多数据源连接,目前服务器版本分别为4及3.2,所以需要兼容这两种版本,在选择依赖包时需特别注意MongoDB版本

1. 依赖引入

mongodb与java驱动版本之间的支持关系如图所示,所以选择好版本非常关键,我之前就是因为版本问题各种报错

在这里插入图片描述

implementation 'org.springframework.boot:spring-boot-starter-data-mongodb:3.0.3'
implementation 'org.mongodb:mongodb-driver-sync:4.0.6'
implementation 'org.mongodb:mongodb-driver-core:4.0.6'
implementation 'org.mongodb:bson:4.0.6'
2. yml配置

这里的配置主要是后面 @ConfigurationProperties(prefix = “spring.data.mongodb.secondary”)用到,如果有第三个数据源同理设置

spring:
  data:
    mongodb:
      primary:
        uri: mongodb://user:password@192.168.0.1:27017/sfxs?authSource=admin&authMechanism=SCRAM-SHA-1
      secondary:
        uri: mongodb://user:password@192.168.0.2:27017/sfxs?authSource=admin&authMechanism=SCRAM-SHA-1
3. 两种操作方式对比

Spring结合MongoDB有两种操作方式:MongoDB Template 和 JPA。
在操作 MongoDB 数据库时,各有优缺点:

对比项MongoDB TemplateJPA
优点(1)更贴近 MongoDB 原生 API,可以充分利用 MongoDB 的所有功能
(2)在进行复杂的查询、聚合等操作时,更灵活和高效
(3)可以直接使用 MongoDB 的查询语言编写查询语句
(1)可以复用 JPA 的编程模型和工具,降低学习成本
(2)与其他 JPA 兼容的数据库无缝切换,提高了应用的移植性
(3)提供了标准化的编程接口,降低了数据访问层的复杂度
缺点(1)需要编写更多的底层代码,开发效率较低
(2)需要对 MongoDB 的数据模型和查询语言有较深的了解
(3)不能与其他 JPA 兼容的数据库无缝切换
(1)可能无法充分利用 MongoDB 的全部功能,功能受限
(2)在进行复杂的查询、聚合等操作时,性能可能较差
(3)需要额外的配置和映射,增加了开发和维护的复杂度

总的来说,MongoDB Template 更适合需要充分利用 MongoDB 特性的应用程序,而 JPA 则更适合需要跨数据库支持或已经基于 JPA 进行开发的项目。具体选择哪种方式,需要结合项目的实际需求和技术栈进行权衡

4. 配置类编写

咱们采用mongoTemplate语法,主要因为以下几点:

  • 简单易用: mongoTemplate 提供了一系列基于 MongoDB Java Driver 的简单 CRUD 操作方法,使用起来非常方便。
  • 支持模板化操作: mongoTemplate 提供了各种模板方法,如 find、insert、update 等,开发者无需直接与 MongoDB Java Driver 交互,提高了开发效率。
  • 支持批量操作: mongoTemplate 支持一次性执行多个数据库操作,如批量插入、更新、删除等,提高了性能。
  • 数据转换支持: mongoTemplate 可以自动将 POJO 转换为 MongoDB 文档,并将查询结果自动映射回 POJO,降低了开发人员的工作量
  • 后续需要复杂的聚合操作,JPA无法满足
/**
 * 默认MONGO数据源配置
 *
 * 默认的第一个数据源,注入时,直接
 * @Autowired
 * private MongoTemplate mongoTemplate;
 */
@Configuration
@EnableMongoRepositories
public class DefaultMongoTemplateConf {
 
    private final MongoProperties mongoProperties;
 
    public DefaultMongoTemplateConf(@Qualifier("mongoProperties") MongoProperties mongoProperties) {
        this.mongoProperties = mongoProperties;
    }
 
    @Bean
    @Primary
    public MongoTemplate mongoTemplate() {
        MongoTemplate mongoTemplate=new MongoTemplate(mongoDatabaseFactory(mongoProperties));
        MappingMongoConverter mongoMapping = (MappingMongoConverter) mongoTemplate.getConverter();
        mongoMapping.afterPropertiesSet();
        return mongoTemplate;
    }
 
    @Bean(name = "oneMongoFactory")
    @Primary
    public MongoDatabaseFactory mongoDatabaseFactory(MongoProperties mongoProperties) {
        return new SimpleMongoClientDatabaseFactory(mongoProperties.getUri());
    }
}

@Configuration
public class MongoConfiguration {

    @Bean(name = "mongoProperties")
    @Primary
    @ConfigurationProperties(prefix = "spring.data.mongodb.primary")
    public MongoProperties masterMongoProperties() {
        return new MongoProperties();
    }

    @Bean(name = "secondaryMongoProperties")
    @ConfigurationProperties(prefix = "spring.data.mongodb.secondary")
    public MongoProperties secondaryMongoProperties() {
        return new MongoProperties();
    }
}
/**
 * 第二个MONGODB数据配置
 */
@Configuration
@EnableMongoRepositories(mongoTemplateRef = SecondaryMongoTemplateConf.MONGO_TEMPLATE)
public class SecondaryMongoTemplateConf {

    public static final String MONGO_TEMPLATE = "secondaryMongoTemplate";

    private final MongoProperties mongoProperties;
 
    public SecondaryMongoTemplateConf(@Qualifier("secondaryMongoProperties") MongoProperties mongoProperties) {
        this.mongoProperties = mongoProperties;
    }
 
    @Bean(name = SecondaryMongoTemplateConf.MONGO_TEMPLATE)
    public MongoTemplate mongoTemplate() {
        return new MongoTemplate(mongoDatabaseFactory(mongoProperties));
    }
 
    @Bean(name = "secondaryMongoFactory")
    public MongoDatabaseFactory mongoDatabaseFactory(MongoProperties mongoProperties) {
        return new SimpleMongoClientDatabaseFactory(mongoProperties.getUri());
    }
 
}
5. 测试类编写

在测试类中,我注入了两种不同数据源,分别查询对应Township信息

@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = DidataCloudApplication.class)
public class DidataTests {
    
    @Autowired
    private MongoTemplate mongoTemplate;
    @Resource(name = SecondaryMongoTemplateConf.MONGO_TEMPLATE)
    private MongoTemplate mongoTemplate2;
    
    @Test
    public void mongo() {
        Query query = new Query(Criteria.where("province_name").is("上海市"));
        Township result = mongoTemplate.findOne(query, Township.class, "township");
        Assert.assertNotNull(result);

        Query query1 = new Query(Criteria.where("province_name").is("上海市"));
        Township result1 = mongoTemplate2.findOne(query1, Township.class, "township");
        Assert.assertNotNull(result1);
    }
}
6. 效果验证

运行test, 测试通过

欢迎关注公众号算法小生,言简意赅干货满满~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
在Spring Boot中集成MongoDB数据可以通过以下步骤完成: 1. 添加MongoDB依赖:在`pom.xml`文件中添加MongoDB驱动的依赖: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-mongodb</artifactId> </dependency> ``` 2. 配置MongoDB数据:在`application.properties`或`application.yml`文件中配置MongoDB连接信息,可以为每个数据定义一个前缀来区分不同的数据配置,例如: ```properties # 第一个数据 spring.data.mongodb.first.uri=mongodb://localhost:27017/db1 spring.data.mongodb.first.database=db1 # 第二个数据 spring.data.mongodb.second.uri=mongodb://localhost:27017/db2 spring.data.mongodb.second.database=db2 ``` 3. 创建MongoDB配置类:创建一个`@Configuration`注解的配置类,用于配置多个`MongoTemplate`实例,每个实例对应一个数据。代码示例: ```java @Configuration public class MultipleMongoConfig { @Value("${spring.data.mongodb.first.uri}") private String firstUri; @Value("${spring.data.mongodb.first.database}") private String firstDatabase; @Value("${spring.data.mongodb.second.uri}") private String secondUri; @Value("${spring.data.mongodb.second.database}") private String secondDatabase; @Bean(name = "firstMongoTemplate") public MongoTemplate firstMongoTemplate() throws Exception { return new MongoTemplate(new MongoClientURI(firstUri)); } @Bean(name = "secondMongoTemplate") public MongoTemplate secondMongoTemplate() throws Exception { return new MongoTemplate(new MongoClientURI(secondUri)); } } ``` 4. 使用多个MongoTemplate:在需要使用不同数据的地方,可以通过`@Qualifier`注解指定使用哪个`MongoTemplate`实例。示例代码: ```java @Service public class MyService { private final MongoTemplate firstMongoTemplate; private final MongoTemplate secondMongoTemplate; public MyService(@Qualifier("firstMongoTemplate") MongoTemplate firstMongoTemplate, @Qualifier("secondMongoTemplate") MongoTemplate secondMongoTemplate) { this.firstMongoTemplate = firstMongoTemplate; this.secondMongoTemplate = secondMongoTemplate; } // 使用 firstMongoTemplate 操作第一个数据 // 使用 secondMongoTemplate 操作第二个数据 } ``` 通过上述步骤,你可以在Spring Boot中成功集成多个MongoDB数据。记得按照实际情况修改配置信息并进行适当调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

沈健_算法小生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值