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

Easter79
• 阅读 799

        之前在崛起于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

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
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
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
4个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Stella981 Stella981
3年前
KVM调整cpu和内存
一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
10个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这
Easter79
Easter79
Lv1
今生可爱与温柔,每一样都不能少。
文章
2.8k
粉丝
5
获赞
1.2k