springboot中mongodb多数据源集成

说完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);
    }
}
案例源码

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值