说完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: host: 127.0 .0 .1 port: 27017 database: sbac_master log: host: 127.0 .0 .1 port: 27017 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