Springboot2.0.X + mongodb多数据源(账号密码)(77)

Easter79
• 阅读 396

        之前在崛起于Springboot2.X + Mongodb多数据源(35),结果发现没有用户名和密码,替换之后不管用,然后重新写一个带用户名和密码的多数据源,方便企业级使用,目前适用于2.0.X版本,高版本的话,里面的配置Factory会过期,所以等有时间在整一个高版本的配置博客。

Springboot2.0.X + mongodb多数据源(账号密码)(77)

1、pom依赖

_<_dependency_> _ _<_groupId_>org.springframework.boot</_groupId_> _ <_artifactId_>spring-boot-starter-data-mongodb</_artifactId_> </_dependency_> _<_dependency_> _ _<_groupId_>org.springframework.boot</_groupId_> _ <_artifactId_>spring-boot-starter-web</_artifactId_> </_dependency_> _<_dependency_> _ _<_groupId_>org.projectlombok</_groupId_> _ _<_artifactId_>lombok</_artifactId_> _ <_optional_>true</_optional_> </_dependency_>

2、application.properties

spring.data.mongodb.first.database=数据库名 spring.data.mongodb.first.uri=mongodb://账号:密码@地址host:3717/数据库名?maxIdleTimeMS=3000

spring.data.mongodb.second.database=数据库名 spring.data.mongodb.second.uri=mongodb://账号:密码@地址host:3717/数据库名?maxIdleTimeMS=3000

3、config配置

@Configuration @Slf4j public class MultiMongoDbConfig { @Bean(name="firstMongoProperties") @Primary @ConfigurationProperties(prefix="spring.data.mongodb.first") public MongoProperties firstMongoProperties() { log.info("-------------------- liveMongoProperties init ---------------------"); return new MongoProperties(); }

@Bean(name\="secondMongoProperties")
@ConfigurationProperties(prefix\="spring.data.mongodb.second")
public MongoProperties secondMongoProperties() {
    log.info("-------------------- monitorMongoProperties init ---------------------");

return new MongoProperties(); }

/\*\*
 \* 如果不写这个转换工具类你在通过mongoTempleate默认向表中插入数据的时候会在表中多一个\_class的字段,通过这个转换类转换后不会出现这个\_class字段。
 \* @param factory mongodb工厂类
 \* @param context 上下文
 \* @param beanFactory bean工厂
 \* @return MappingMongoConverter
 \*/
@Bean(name \= "mongoConverter")
public MappingMongoConverter mappingMongoConverter(MongoDbFactory factory, MongoMappingContext context, BeanFactory beanFactory) {
    DbRefResolver dbRefResolver = new DefaultDbRefResolver(factory);

MappingMongoConverter mappingConverter = new MappingMongoConverter(dbRefResolver, context); try { mappingConverter.setCustomConversions(beanFactory.getBean(CustomConversions.class)); } catch (NoSuchBeanDefinitionException ignore) {

    }
    // Don't save \_class to mongo

mappingConverter.setTypeMapper(new DefaultMongoTypeMapper(null)); return mappingConverter; } }

first库配置

@Configuration @EnableMongoRepositories(basePackages = "com.sports.statistics.repository.live", mongoTemplateRef = "liveMongo") public class LiveMongoTemplate {

@Autowired

@Qualifier("firstMongoProperties") private MongoProperties mongoProperties; @Primary @Bean(name = "liveMongo") public MongoTemplate firstMongoTemplate() { return new MongoTemplate(firstFactory(this.mongoProperties)); // return new MongoTemplate(firstFactory(this.mongoProperties), MongoTemplateHolder.mongoConverter()); }

@Bean

@Primary public MongoDbFactory firstFactory(MongoProperties mongoProperties) { MongoClientOptions.Builder options = new MongoClientOptions.Builder(); options.readPreference(ReadPreference.primary()); options.connectionsPerHost(10); return new SimpleMongoDbFactory(new MongoClientURI(mongoProperties.getUri(), options)); } }

second库配置

@Configuration @EnableMongoRepositories(basePackages = "com.sports.statistics.repository.monitor", mongoTemplateRef = "monitorMongo") public class MonitorMongoTemplate { @Autowired @Qualifier("secondMongoProperties") private MongoProperties mongoProperties; @Bean(name = "monitorMongo") public MongoTemplate secondTemplate() { return new MongoTemplate(secondFactory(this.mongoProperties)); //return new MongoTemplate(secondFactory(this.mongoProperties), MongoTemplateHolder.mongoConverter()); }

@Bean

public MongoDbFactory secondFactory(MongoProperties mongoProperties) { MongoClientOptions.Builder options = new MongoClientOptions.Builder(); options.readPreference(ReadPreference.primary()); options.connectionsPerHost(10); return new SimpleMongoDbFactory(new MongoClientURI(mongoProperties.getUri(), options)); } }

@Component public class MongoTemplateHolder implements ApplicationContextAware {

private static ApplicationContext applicationContext; 

@Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { if (MongoTemplateHolder.applicationContext == null) { MongoTemplateHolder.applicationContext = applicationContext; } }

/\*\*
 \* 获取容器
 \* @return ApplicationContext
 \*/
public static ApplicationContext getApplicationContext() {
    return applicationContext;

}

/\*\*
 \* 获取MongoTemplate模板
 \* @param source 数据源(你想要获取的数据源)
 \* @return MongoTemplate
 \*/
public static MongoTemplate getBean(String source) throws Exception {
    if (StringUtils.isEmpty(source)) {
        throw new Exception("=========数据源名称不能为空\=========");

} return (MongoTemplate) getApplicationContext().getBean(source); }

/\*\*
 \* 获取不同数据源对应的mongodbTemplate
 \* @author chengjian
 \* @date 2020/9/15 9:47 上午
 \* @param mongoDbEnum 数据源信息
 \*/
public static MongoTemplate getBean(MongoDbEnum mongoDbEnum) throws Exception {
    if (mongoDbEnum == null){
        throw new Exception("=========数据源名称不能为空\=========");

}

    return (MongoTemplate) getApplicationContext().getBean(mongoDbEnum.getDatabaseName());

}

/\*\*
 \* @param source 数据源
 \* @param name 数据库名称
 \* @return MongoCollection
 \*/
public static DBCollection getCollection(String source, String name) throws Exception {
    if (StringUtils.isEmpty(source)) {
        throw new Exception("=========数据源名称不能为空\=========");

} if (StringUtils.isEmpty(name)) { throw new Exception("=========空的表名称不能获取MongoCollection========="); } MongoTemplate template = (MongoTemplate) getApplicationContext().getBean(source); return (DBCollection) template.getCollection(name); }

public static MappingMongoConverter mongoConverter() {
    return (MappingMongoConverter) getApplicationContext().getBean("mongoConverter"); } }

4、枚举

@Getter @AllArgsConstructor @NoArgsConstructor public enum MongoDbEnum { _ /** _ * 数据源 _ */ _ LIVE("liveMongo"), MONITOR("monitorMongo"); private String databaseName; }

5、repository

Springboot2.0.X + mongodb多数据源(账号密码)(77)

first库表

public interface UserRepository extends MongoRepository_<User, String_> { }

second库表

public interface ChatBanRepository extends MongoRepository_<ChatBan, String_> { }

6、controller测试

@RestController @RequestMapping(value = "/user") public class UserController { @Resource UserRepository userRepository; @Resource ChatBanRepository chatBanRepository;

@GetMapping(value = "/test1") public String test1() throws Exception { System.out.println("first库:user数量=="+ userRepository.count()); Query query = new Query(); MongoTemplate mongoTemplate = MongoTemplateHolder.getBean(MongoDbEnum.LIVE.getDatabaseName()); System.out.println("first库:user数量=="+ mongoTemplate.count(query,"user"));

System.out.println("second库:chat数量=="+ chatBanRepository.count());

return "OK"; } }

7、结果

Springboot2.0.X + mongodb多数据源(账号密码)(77)

测试成功1

点赞
收藏
评论区
推荐文章
刚刚好 刚刚好
4个月前
css问题
1、在IOS中图片不显示(给图片加了圆角或者img没有父级)<div<imgsrc""/</divdiv{width:20px;height:20px;borderradius:20px;overflow:h
blmius blmius
1年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
晴空闲云 晴空闲云
4个月前
css中box-sizing解放盒子实际宽高计算
我们知道传统的盒子模型,如果增加内边距padding和边框border,那么会撑大整个盒子,造成盒子的宽度不好计算,在实务中特别不方便。boxsizing可以设置盒模型的方式,可以很好的设置固定宽高的盒模型。盒子宽高计算假如我们设置如下盒子:宽度和高度均为200px,那么这会这个盒子实际的宽高就都是200px。但是当我们设置这个盒子的边框和内间距的时候,那
艾木酱 艾木酱
3个月前
快速入门|使用MemFire Cloud构建React Native应用程序
MemFireCloud是一款提供云数据库,用户可以创建云数据库,并对数据库进行管理,还可以对数据库进行备份操作。它还提供后端即服务,用户可以在1分钟内新建一个应用,使用自动生成的API和SDK,访问云数据库、对象存储、用户认证与授权等功能,可专
Stella981 Stella981
1年前
KVM调整cpu和内存
一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid
Wesley13 Wesley13
1年前
Java日期时间API系列36
  十二时辰,古代劳动人民把一昼夜划分成十二个时段,每一个时段叫一个时辰。二十四小时和十二时辰对照表:时辰时间24时制子时深夜11:00凌晨01:0023:0001:00丑时上午01:00上午03:0001:0003:00寅时上午03:00上午0
Wesley13 Wesley13
1年前
MySQL查询按照指定规则排序
1.按照指定(单个)字段排序selectfromtable_nameorderiddesc;2.按照指定(多个)字段排序selectfromtable_nameorderiddesc,statusdesc;3.按照指定字段和规则排序selec
Wesley13 Wesley13
1年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
helloworld_34035044 helloworld_34035044
6个月前
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
helloworld_28799839 helloworld_28799839
4个月前
常用知识整理
Javascript判断对象是否为空jsObject.keys(myObject).length0经常使用的三元运算我们经常遇到处理表格列状态字段如status的时候可以用到vue