Springboot集成MongoDb多数据源(五)
上一章已经介绍了MongoDb介绍以及集成,现在进行MongoDb多数据源的讲解。
1、pom包配置
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-autoconfigure</artifactId>
<version>RELEASE</version>
</dependency>
2、配置文件application.properties形式添加两条数据源,如下
mongodb.first.host = 127.0.0.1
mongodb.first.port = 27017
mongodb.first.database = multi1
mongodb.second.host = 127.0.0.1
mongodb.second.port = 27017
mongodb.second.database = multi2
3、配置两个库的数据源
3.1 封装读取以mongodb开头的两个配置文件,注意此@ConfigurationProperties对应的mongodb与数据源中对应。
prefix = "mongodb :加载配置文件分隔符
new MongoProperties():直接加载配置文件类
@ConfigurationProperties(prefix = "mongodb")
public class MultipleMongoProperties {
private MongoProperties first = new MongoProperties();
private MongoProperties second = new MongoProperties();
public MongoProperties getFirst() {
return first;
}
public void setFirst(MongoProperties first) {
this.first = first;
}
public MongoProperties getSecond() {
return second;
}
public void setSecond(MongoProperties second) {
this.second = second;
}
}
3.2 配置不同包路径下使用不同的数据源
第一个库的封装
@Configuration
@EnableMongoRepositories(basePackages = "com.example.multipledsmongodb.model.first",
mongoTemplateRef = FirstMongoConfig.MONGO_TEMPLATE)
public class FirstMongoConfig {
protected static final String MONGO_TEMPLATE = "firstMongoTemplate";
}
第二个库的封装
@Configuration
@EnableMongoRepositories(basePackages = "com.example.multipledsmongodb.model.second",
mongoTemplateRef = SencondMongoConfig.MONGO_TEMPLATE)
public class SencondMongoConfig {
protected static final String MONGO_TEMPLATE = "sencondMongoTemplate";
}
3.3 读取对应的配置信息并且构造对应的MongoTemplate
@Configuration
public class MultipleMongoConfig {
@Autowired
private MultipleMongoProperties mongoProperties;
@Primary
@Bean(name = FirstMongoConfig.MONGO_TEMPLATE)
public MongoTemplate firstMongoTemplate() throws Exception {
return new MongoTemplate(primaryFactory(this.mongoProperties.getFirst()));
}
@Bean
@Qualifier(SencondMongoConfig.MONGO_TEMPLATE)
public MongoTemplate sencondMongoTemplate() throws Exception {
return new MongoTemplate(secondaryFactory(this.mongoProperties.getSecond()));
}
@Bean
@Primary
public MongoDbFactory primaryFactory(MongoProperties mongo) throws Exception {
return new SimpleMongoDbFactory(new MongoClient(mongo.getHost(), mongo.getPort()),
mongo.getDatabase());
}
@Bean
public MongoDbFactory secondaryFactory(MongoProperties mongo) throws Exception {
return new SimpleMongoDbFactory(new MongoClient(mongo.getHost(), mongo.getPort()),
mongo.getDatabase());
}
}
两个库的配置信息已经完成。
4、创建两个库分别对应的对象和Repository
@Document(collection = "first_obj")
public class FirstObj {
@Id
private String id;
private String value;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
public FirstObj(String id, String value) {
this.id = id;
this.value = value;
}
@Override
public String toString() {
return "FirstObj{" +
"id='" + id + '\'' +
", value='" + value + '\'' +
'}';
}
}
对应的Repository
public interface FirstRepository extends MongoRepository<FirstObj, String> {
}
继承了 MongoRepository 会默认实现很多基本的增删改查,省了很多自己写dao层的代码。
Second和上面的代码类似就不贴出来了
5、最后测试
@RunWith(SpringRunner.class)
@SpringBootTest
public class MultipleDataSourceTest {
@Autowired
private FirstRepository firstRepository;
@Autowired
private SecondRepository secondRepository;
@Test
public void save() {
this.firstRepository
.save(new FirstObj(null, "第一个库的对象"));
this.secondRepository
.save(new SecondObj(null, "第二个库的对象"));
List<FirstObj> primaries = this.firstRepository.findAll();
for (FirstObj primary : primaries) {
System.out.println(primary.toString());
}
List<SecondObj> secondaries = this.secondRepository.findAll();
for (SecondObj secondary : secondaries) {
System.out.println(secondary.toString());
}
}
}
执行@Test注解的方法后
打开Robo 3T查看信息如下:
多数据源就此完毕,谢谢!
6、遇到的问题
6.1 报Consider defining a bean of type com.xxRepository'in your configuration
原因:发现在启动类中缺少注解@EnableTransactionManagement
6.2 ....nested exception is java.lang.NullPointerException
可能原因:在新建的MultipleMongoProperties里,@ConfigurationProperties(prefix = "mongodb")的注解的mongodb要和数据源配置一致,并且new的对像的引用也要保持一致。
7、最后
参考文档:https://blog.****.net/a123demi/article/details/78239251
demo地址:https://github.com/xuhuaguang/multipleds-mongodb.git