0%

springboot中mongodb多数据源集成

说完springboot中如何使用mongodb,接下来就来看一下mongod的多数据源集成。因为多数据源在开发中还是很常见的,比如在中小型项目中,我们可以将日志存储在mongo中(单独一个日志库)。

这里只说明一下多数据源的集成方式,springboot中mongo的使用可详见springboot中mongodb集成与使用

mogno多数据源配置

首先我们定义两个数据源配置,如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
mongodb:
master:
# uri: mongodb://127.0.0.1:27017/sbac_master
host: 127.0.0.1
port: 27017
# username: sbac
# password: sbac
database: sbac_master
log:
# uri: mongodb://127.0.0.1:27017/sbac_log
host: 127.0.0.1
port: 27017
# username: sbac
# password: sbac
database: sbac_log

这里使用host+port方式,不验证密码,当然亦可以选择uri方式,只是在稍后的配置有所改动即可。

此时,我们来配置我们的多数据源,代码如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
@Configuration
public class MongoConfig {

@Primary
@Bean(name = "mongoMasterProperties")
@ConfigurationProperties(prefix = "mongodb.master")
public MongoProperties mongoMasterProperties() {
return new MongoProperties();
}

@Bean(name = "mongoLogProperties")
@ConfigurationProperties(prefix = "mongodb.log")
public MongoProperties mongoLogProperties() {
return new MongoProperties();
}

@Primary
@Bean("mongoTemplate")
public MongoTemplate mongoMasterTemplate(@Qualifier("mongoMasterProperties") MongoProperties mongoProperties) {
return new MongoTemplate(mongoDbFactory(mongoProperties));
}

@Bean("mongoLogTemplate")
public MongoTemplate mongoLogTemplate(@Qualifier("mongoLogProperties") MongoProperties mongoProperties) {
return new MongoTemplate(mongoDbFactory(mongoProperties));
}

private MongoDbFactory mongoDbFactory(MongoProperties mongoProperties) {
MongoClient mongoClient = new MongoClient(mongoProperties.getHost(),mongoProperties.getPort());
return new SimpleMongoDbFactory(mongoClient, mongoProperties.getDatabase());
}
}

这里我们手动来配置每个数据源的配置属性,以及最后生成MongoTemplate。可以看见,如上是host+port方式构建MongoDbFactory的,如果要使用密码验证,则可以换一个MongoClient的构造函数来生成MongoClient即可(详见MongoClient源码),如下:

1
2
3
4
5
6
ServerAddress serverAddress = new ServerAddress(mongoProperties.getHost(), mongoProperties.getPort());
MongoClient mongoClient = new MongoClient(
serverAddress,
MongoCredential.createScramSha1Credential(mongoProperties.getUsername(),
mongoProperties.getDatabase(), mongoProperties.getPassword()),
new MongoClientOptions.Builder().build());

或者要使用uri的方式来配置,以如此:

1
MongoClient mongoClient = new MongoClient(mongoProperties.getUri());

mongo多数据源使用

由于是使用配置不同的MongoTemplate的形式来形成多数据源,所以这里便用MongoTemplate来使用多数据源,下面给出两个不同数据源的吃持久层代码(因为旨在看使用方式,所以其中po实体以及测试验证代码就不再贴出了)。

master数据源

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
@Repository
public class UserRepository {

private MongoTemplate mongoTemplate;

@Autowired
public UserRepository(MongoTemplate mongoTemplate) {
this.mongoTemplate = mongoTemplate;
}

public void insert(User user) {
mongoTemplate.insert(user);
}

public User findByUsername(String username) {
Query query = new Query();
query.addCriteria(Criteria.where("username").is(username));
return mongoTemplate.findOne(query, User.class);
}
}

log数据源

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
@Repository
public class SystemLogRepository {

private MongoTemplate mongoLogTemplate;

@Autowired
public SystemLogRepository(@Qualifier("mongoLogTemplate") MongoTemplate mongoLogTemplate) {
this.mongoLogTemplate = mongoLogTemplate;
}

public void insert(SystemLog systemLog) {
mongoLogTemplate.insert(systemLog);
}

public List<SystemLog> listLog(Date beginTime, Date endTime) {
Query query = new Query();
query.addCriteria(Criteria.where("createTime")
.lte(endTime).gte(beginTime));
return mongoLogTemplate.find(query, SystemLog.class);
}
}

案例源码

案例源码地址:https://github.com/lazycece/springboot-actual-combat/tree/master/springboot-ac-mongodb/springboot-ac-mongodb-multi