说完springboot中如何使用mongodb,接下来就来看一下mongod的多数据源集成。因为多数据源在开发中还是很常见的,比如在中小型项目中,我们可以将日志存储在mongo中(单独一个日志库)。
这里只说明一下多数据源的集成方式,springboot中mongo的使用可详见springboot中mongodb集成与使用
mogno多数据源配置
首先我们定义两个数据源配置,如下所示:
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方式,只是在稍后的配置有所改动即可。
此时,我们来配置我们的多数据源,代码如下所示:
@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
源码),如下:
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的方式来配置,以如此:
MongoClient mongoClient = new MongoClient(mongoProperties.getUri());
mongo多数据源使用
由于是使用配置不同的MongoTemplate
的形式来形成多数据源,所以这里便用MongoTemplate
来使用多数据源,下面给出两个不同数据源的吃持久层代码(因为旨在看使用方式,所以其中po实体以及测试验证代码就不再贴出了)。
master数据源
@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数据源
@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);
}
}