springboot 多个数据库配置

news/2024/7/5 4:54:57

文章目录

      • 一、pom文件依赖
      • 二、yaml文件配置
      • 三、代码实现
        • 1、main函数配置
        • 2、创建mongodb工厂
        • 3、主数据源配置
        • 4、副数据源配置
        • 5、工具封装
        • 6、使用
      • 四、踩的坑
        • 1、MongoClientURI找不到
        • 2、找不到mongoTemplate

一、pom文件依赖

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>

二、yaml文件配置

spring:
  data:
    mongodb:
      primary:
        uri: mongodb://root:service_ip@10.10.10.10:27017/database1_name?authSource=admin&slaveOk=true&replicaSet=rs1&write=1&readPreference=secondaryPreferred&connectTimeoutMS=300000
      secondary:
        uri: mongodb://root:service_ip@10.10.10.10:27017/database2_name/?authSource=admin&slaveOk=true&replicaSet=rs1&write=1&readPreference=secondaryPreferred&connectTimeoutMS=300000

primary:主数据源
secondary:副数据源

三、代码实现

1、main函数配置

// 排除springBoot启动自动加载MongoDB
@SpringBootApplication(exclude= {MongoAutoConfiguration.class, MongoDataAutoConfiguration.class})

public class ContentServiceApplication {

    public static void main(String[] args) {
        SpringApplication.run(ContentServiceApplication.class, args);
    }

}

在启动类上添加注解exclude,排除springBoot启动时自动加载MongoDB;

2、创建mongodb工厂

package com.content.admin.contentservice.config;

import com.mongodb.ConnectionString;
import org.springframework.data.mongodb.MongoDatabaseFactory;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.SimpleMongoClientDbFactory;

public abstract class AbstractMongoConfig {
    
    private String uri; // mongodb 地址

    /**
     * 获取MongoTemplate
     * @return
     * @throws Exception
     */
    public abstract MongoTemplate getMongoTemplate() throws Exception;

    /**
     * 创建mongodb工厂
     * @return
     * @throws Exception
     */
    public MongoDatabaseFactory mongoDbFactory() throws Exception
    {
        ConnectionString connectionString = new ConnectionString(uri);
        return new SimpleMongoClientDbFactory(connectionString);

//        // 参考其他博客,但我本地MongoClientURI始终找不到。改写成上面的写法
//        MongoClientURI mongoClientURI = new MongoClientURI(uri);
//        return new SimpleMongoDbFactory(mongoClientURI);
    }

    public String getUri() {
        return uri;
    }

    public void setUri(String uri) {
        this.uri = uri;
    }
}

private String uri;uri的命名要和yaml文件中的命名保持一致。

3、主数据源配置

package com.content.admin.contentservice.config;

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.data.mongodb.core.MongoTemplate;

@Configuration
@ConfigurationProperties(prefix = "spring.data.mongodb.primary")
public class PrimaryMongoConfig extends AbstractMongoConfig {

    @Primary //在使用@Autowired注入的时候,如果不特殊指明(特殊指明请用@Qualifier的讲解),那么默认就注入被@Primary标记的类
    @Override
    @Bean(name = "mongoTemplate")
//    @Bean(name = "primaryMongoTemplate")
    public MongoTemplate getMongoTemplate() throws Exception {
        return new MongoTemplate(mongoDbFactory());
    }
}

这里要注意,@ConfigurationProperties(prefix = "spring.data.mongodb.primary") 中的路径要和yaml配置文件的对应。

4、副数据源配置

package com.content.admin.contentservice.config;


import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.mongodb.core.MongoTemplate;

@Configuration
@ConfigurationProperties(prefix = "spring.data.mongodb.secondary") 
public class SecondaryMongoConfig extends AbstractMongoConfig {

    @Override
    @Bean(name = "secondaryMongoTemplate")
    public MongoTemplate getMongoTemplate() throws Exception {
        return new MongoTemplate(mongoDbFactory());
    }
}

这里要注意,@ConfigurationProperties(prefix = "spring.data.mongodb.secondary") 中的路径要和yaml配置文件的对应。

5、工具封装

package com.content.admin.contentservice.util;

import com.mongodb.MongoException;
import com.mongodb.client.result.DeleteResult;
import com.mongodb.client.result.UpdateResult;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.aggregation.Aggregation;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.core.query.Update;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.util.List;

@Component
public class MongoUtils {
//    @Resource
//    MongoTemplate mongoTemplate;

	// 主数据源
    @Autowired
    @Qualifier(value = "mongoTemplate")
//    @Qualifier(value = "primaryMongoTemplate")
    private MongoTemplate mongoTemplate;

	// 副数据源
    @Autowired
    @Qualifier(value = "secondaryMongoTemplate")
    private MongoTemplate mongoTemplate2;


    public String getCurrentCollection(Class<?> o){
        return mongoTemplate.getCollectionName(o);
    }
    public void createCollection(String collection){
        if(!mongoTemplate.collectionExists(collection)){
            mongoTemplate.createCollection(collection);
        }
    }

    public Object add(Object o , String collectionName){
        Object result;
        try{
            result = mongoTemplate.insert(o , collectionName);
        }catch (MongoException e){
            System.out.println(e.getMessage());
            throw new MongoException(e.getMessage());
        }
        return result;
    }

    public void delete(Query query , Object obj , String collectionName){
        mongoTemplate.remove(query, obj .getClass(), collectionName);
    }

    public boolean update(Query query , Update update , Class<?> clazz , String collectionName){
        UpdateResult result =  mongoTemplate.updateMulti(query, update, clazz, collectionName);
        return result.wasAcknowledged();
    }

    public List<?> getAllByCollectionName(Class<?> clazz , String collectionName){
        return mongoTemplate.findAll(clazz,collectionName);
    }

    public List <?> getByConditionAndCollectionName(Query query , Class<?> clazz , String collectionName){
        return mongoTemplate.find(query, clazz, collectionName);
    }

    public Object getOneByCondition(Query query , Class<?> clazz , String collectionName){
        return mongoTemplate.findOne(query, clazz , collectionName);
    }

    public Boolean exists(Query query , Class<?> clazz , String collectionName){
        return mongoTemplate.exists(query , clazz ,collectionName);
    }

    public DeleteResult remove(Query query , Class<?> clazz , String collectionName){
        return mongoTemplate.remove(query , clazz , collectionName);
    }
    public long getCount(Query query, Class<?> clazz , String collection){
        return mongoTemplate.count(query, clazz , collection);
    }

    public List <?> lookUp(Aggregation aggregation , String table , Class<?> clazz){
        return mongoTemplate.aggregate(aggregation , table , clazz).getMappedResults();
    }

    public Object add2(Object o , String collectionName){
        Object result;
        try{
            result = mongoTemplate2.insert(o , collectionName);
        }catch (MongoException e){
            System.out.println(e.getMessage());
            throw new MongoException(e.getMessage());
        }
        return result;
    }

    public Object getOneByCondition2(Query query , Class<?> clazz , String collectionName){
        return mongoTemplate2.findOne(query, clazz , collectionName);
    }

    public Boolean exists2(Query query , Class<?> clazz , String collectionName){
        return mongoTemplate2.exists(query , clazz ,collectionName);
    }
}

6、使用

package com.content.admin.contentservice.service;

import com.content.admin.contentservice.util.MongoUtils;
import javax.annotation.Resource;

@Service
public class TopicServiceImpl implements TopicService {

    @Resource
    MongoUtils mongoUtils;

    @Override
    public ResponseBean getList(TopicVo topicVo){
    	
    	...
    	
        List<?> list =  mongoUtils.getOneByCondition(query , TopicEntity.class , collection);
		
		...
    }
}

TopicEntity.class是和数据库字段对应的entity。
collection是表名。

四、踩的坑

1、MongoClientURI找不到

public abstract class AbstractMongoConfig {

    private String uri; // mongodb 地址

    /**
     * 获取MongoTemplate
     * @return
     * @throws Exception
     */
    public abstract MongoTemplate getMongoTemplate() throws Exception;

    /**
     * 创建mongodb工厂
     * @return
     * @throws Exception
     */
    public MongoDatabaseFactory mongoDbFactory() throws Exception
    {
        ConnectionString connectionString = new ConnectionString(uri);
        return new SimpleMongoClientDbFactory(connectionString);

//        // 参考其他博客,但我本地MongoClientURI始终找不到。改写成上面的写法
//        MongoClientURI mongoClientURI = new MongoClientURI(uri);
//        return new SimpleMongoDbFactory(mongoClientURI);
    }

    public String getUri() {
        return uri;
    }

    public void setUri(String uri) {
        this.uri = uri;
    }
}

我本地在创建mongodb工厂时,始终找不到MongoClientURI,最后改成上面的写法。

2、找不到mongoTemplate

报错信息

com.content.admin.contentservice.shiro.ShiroConfig required a bean named 'mongoTemplate' that could not be found.

原因:找不到mongoTemplate

解决方法:
在配置主数据源时,把primaryMongoTemplate修改为mongoTemplate

参考链接:

https://blog.csdn.net/zhan107876/article/details/94588388
https://blog.csdn.net/jin809391761/article/details/89455587
https://zhangdhing.blog.csdn.net/article/details/88634598?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.control&dist_request_id=&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.control


http://www.niftyadmin.cn/n/3656128.html

相关文章

为什么你的软件需要IDE特征?

为什么你的软件需要IDE特征&#xff1f;IDE&#xff0c;就是Integrated Development Environment的缩写&#xff0c;一般而言&#xff0c;只有软件开发工具或设计工具才具备IDE特征&#xff0c;之所以如此的原因之一也许是因为开发IDE特征的技术工作比较繁杂。现代应用软件由于…

mongodb 删除字段

使用springboot mongodb工具&#xff0c;删除多余字段。 1、pom文件依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-mongodb</artifactId></dependency>2、代码实现 topping、toppi…

关于Tangram的可视化设计支持

关于Tangram的可视化设计支持Tangram开源版本是Tangram系列中“最小”的版本&#xff0c;在这个版本中包含了Tangram的最基本的功能点&#xff0c;即软件UI框架的可视化设计。通常&#xff0c;软件开发者都是通过Coding的方式进行软件的框架设计&#xff0c;给定一个如下的UI框…

asList remove异常原因分析

使用Arrays.asList后&#xff0c;调用remove异常问题记录。 // 第一种String str "第一个,第二个,第三个,第四个,";List<String> list Arrays.asList(str.split(","));list.remove(1);// 第二种List<String> list2 new ArrayList<>()…

Microsoft Visual Basic for Application技术概要

Microsoft Visual Basic for Application技术概要众所周知&#xff0c;Visual Basic系列产品在Microsoft的产品线中占有非常独特的位置&#xff0c;从IE&#xff0c;到Office&#xff0c;乃至Visual Studio系列产品中总要配备一个基于Visual Basic的描述引擎以便进行功能扩展。…

mongodb 多表关联查询

需求 mongodb库中有三张表&#xff0c;需求&#xff1a;查询表A中的数据&#xff0c;但这些数据的threadId字段&#xff0c;不能存在于表B和表C中&#xff0c;做一个过滤查询&#xff0c;需要分页和排序。 mongodb 命令实现 {"aggregate": "__collection__&q…

WPF,一次洗牌……

WPF,一次洗牌……昨天&#xff0c;在CSDN上看一篇孟岩的文章&#xff0c;谈及WPF带来的震撼&#xff0c;其实&#xff0c;WPF对今天的开发者来讲&#xff0c;已经不是很新的概念了&#xff0c;在MSN里&#xff0c;也与部分朋友交流对WPF的看法。最早体验WPF&#xff0c;也许是在…

Tangram开源版本发布

Tangram开源版本发布经过一段难忘的忙碌&#xff0c;Tangram的第一个完整版本杀青了。回想来到北京的几年&#xff0c;可谓感慨万千&#xff0c;开发产品是心志的磨练&#xff0c;这话没错&#xff01;经历身体与身心的煎熬&#xff0c;使我深刻的意识到勇者有畏&#xff0c;但…