最近在做系统迁移,就是我们后台管理系统有两个,一个是新的后台,一个是老的后台,有两个数据库(其中还有些表是同名的,也有些数据是耦合的)。我们现在想的是把老后台的功能慢慢的迁移到新后台来,因为两个库其中有些表同名,数据耦合的,所以我们就想着还是用两个数据源,先迁功能。所以我就需要在新后台配置多数据源。
具体代码如下,yml文件如下
spring:
data:
## mongodb配置
mongodb:
primary:
uri: mongodb://用户名:密码@ip:27017/库名
secondary:
uri: mongodb://用户名:密码@ip:27017/库名
mongodb的config文件如下
@Configuration
public class MultipleMongoConfig {
@Value("${spring.data.mongodb.primary.uri}")
private String primaryUri;
@Value("${spring.data.mongodb.secondary.uri}")
private String otherUri;
@Primary
@Bean(name = "mongoTemplate")
public MongoTemplate primaryMongoTemplate() {
SimpleMongoClientDatabaseFactory simpleMongoClientDbFactory = new SimpleMongoClientDatabaseFactory(primaryUri);
return new MongoTemplate(simpleMongoClientDbFactory);
}
@Bean(name = "secondaryMongoTemplate")
public MongoTemplate otherMongoTemplate() {
SimpleMongoClientDatabaseFactory simpleMongoClientDbFactory =new SimpleMongoClientDatabaseFactory(otherUri);
return new MongoTemplate(simpleMongoClientDbFactory);
}
}
springboot的启动类,需要如下修改,这是因为Spring Boot 会自动注入 mongoTemplate ,与我们配置的多个数据源有冲突。为了防止默认注入,需要排除自动注入的类。在 Spring Boot 的启动类 Applocation.java 添加排除类注解
@SpringBootApplication(exclude = {
MongoAutoConfiguration.class,
MongoDataAutoConfiguration.class})
开始使用多数据源
@Autowired
@Qualifier("secondaryMongoTemplate")
private MongoTemplate secondaryMongoTemplate;
//主数据源使用
@Autowired
protected MongoTemplate mongoTemplate;
mo实体类,其中只截取部分字段,其中需要注意的是,因为我的集合名称是svOrderMo,但是我的类名是ResSvOrderMo ,所以在注解@Document上假如集合名称,要不然的话,在查询时,MongoTemplate.getCollectionName(entityClass)方法会从类名获取到集合名称为resSvOrderMo ,这样就导致查询不到数据(因为集合名根本不存在),加上注解映射就能解决这个问题。
@Document(collection = "svOrderMo")
@Data
@ApiModel(value = "服务单对象")
public class ResSvOrderMo {
/**
* 服务单ID
*/
@Id
@ApiModelProperty(value = "服务单ID", example = "202004231436463110")
private String svOrderId;
/**
* 客户ID
*/
@Indexed
@ApiModelProperty(value = "客户ID", example = "5e5dffdf077d95002d973ebe")
private String custId;
}