当前位置: 首页 > news >正文

springboot配置两个MongoDB

由于项目需要访问不通的数据,需要配置两个MongoDB(也可以是多个)

添加依赖

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

配置application.yml或application.properties

spring:  data:  mongodb:  primary:  uri: mongodb://user:password@localhost:27017/primarydb  secondary:  uri: mongodb://user:password@localhost:27018/secondarydb

java配置

启动类排除MongoDB自动配置

@SpringBootApplication(exclude = {MongoAutoConfiguration.class, MongoDataAutoConfiguration.class})
public class Application {public static void main(String[] args) {SpringApplication.run(Application.class, args);}}

primary配置类

package XXX;import com.mongodb.MongoClient;
import com.mongodb.MongoClientOptions;
import org.springframework.beans.factory.ObjectProvider;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.autoconfigure.mongo.MongoClientFactory;
import org.springframework.boot.autoconfigure.mongo.MongoProperties;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.core.env.Environment;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.SimpleMongoDbFactory;
import org.springframework.data.mongodb.repository.config.EnableMongoRepositories;//此处建议用package。之前用class,会绑定错误的MongoTemplate
@Configuration
@EnableMongoRepositories(basePackages = "com.xxx.dao.primary", mongoTemplateRef = "primaryMongoTemplate")
public class PrimaryMongodbConfig {@Autowiredprivate ObjectProvider<MongoClientOptions> options;@Autowiredprivate Environment environment;@Bean(name = "primaryPropertiess")@ConfigurationProperties(prefix = "spring.data.mongodb.primary")@Primarypublic MongoProperties primaryPropertiess() {return new MongoProperties();}@Bean(name = "primaryMongoClient")public MongoClient mongoClient(@Qualifier("primaryPropertiess") MongoProperties mongoProperties) {MongoClientFactory factory = new MongoClientFactory(mongoProperties, environment);return factory.createMongoClient(options.getIfAvailable());}@Bean(name = "primaryMongoDBFactory")public SimpleMongoDbFactory mongoDbFactory(@Qualifier("primaryMongoClient") MongoClient mongoClient,@Qualifier("primaryPropertiess") MongoProperties mongoProperties) {String database = mongoProperties.getMongoClientDatabase();return new SimpleMongoDbFactory(mongoClient, database);}@Bean(name = "primaryMongoTemplate")public MongoTemplate mongoTemplate(@Qualifier("primaryMongoDBFactory") SimpleMongoDbFactory mongoDatabaseFactory) {return new MongoTemplate(mongoDatabaseFactory);}
}
secondary配置类
package com.xxx.mongo;import com.mongodb.MongoClient;
import com.mongodb.MongoClientOptions;
import org.springframework.beans.factory.ObjectProvider;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.autoconfigure.mongo.MongoClientFactory;
import org.springframework.boot.autoconfigure.mongo.MongoProperties;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.env.Environment;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.SimpleMongoDbFactory;
import org.springframework.data.mongodb.repository.config.EnableMongoRepositories;@Configuration
@EnableMongoRepositories(basePackages = "com.xxx.dao.secondary", mongoTemplateRef = "secondaryMongoTemplate")
public class SecondMongodbConfig {@Autowiredprivate ObjectProvider<MongoClientOptions> options;@Autowiredprivate Environment environment;@Bean(name = "secondaryProperties")@ConfigurationProperties(prefix = "spring.data.mongodb.secondary")public MongoProperties secondaryProperties() {return new MongoProperties();}@Bean(name = "secondaryMongoClient")public MongoClient mongoClient(@Qualifier("secondaryProperties") MongoProperties mongoProperties) {MongoClientFactory factory = new MongoClientFactory(mongoProperties, environment);return factory.createMongoClient(options.getIfAvailable());}@Bean(name = "secondaryMongoDBFactory")public SimpleMongoDbFactory mongoDbFactory(@Qualifier("secondaryMongoClient") MongoClient mongoClient,@Qualifier("secondaryProperties") MongoProperties mongoProperties) {String database = mongoProperties.getMongoClientDatabase();return new SimpleMongoDbFactory(mongoClient, database);}@Bean(name = "secondaryMongoTemplate")public MongoTemplate mongoTemplate(@Qualifier("secondaryMongoDBFactory") SimpleMongoDbFactory mongoDatabaseFactory) {return new MongoTemplate(mongoDatabaseFactory);}
}

OrderInfoPrimaryDao

package com.xxx.dao.primary;import com.xxx.mongo.OrderInfoBase;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.data.mongodb.repository.MongoRepository;
import org.springframework.data.mongodb.repository.Query;
import org.springframework.stereotype.Repository;import java.util.List;@Repository
public interface OrderInfoPrimaryDao extends MongoRepository<OrderInfoPrimary, Long> {/**** @param orderId* @return*/List<OrderInfoPrimary> findByOrderId(Long orderId);}
package com.xxx.dao.secondary;import com.xxx.mongo.OrderInfoBase;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.data.mongodb.repository.MongoRepository;
import org.springframework.data.mongodb.repository.Query;
import org.springframework.stereotype.Repository;import java.util.List;@Repository
public interface OrderInfoSecondaryDao extends MongoRepository<OrderInfoSecondary, Long> {/**** @param orderId* @return*/List<OrderInfoSecondary> findByOrderId(Long orderId);}

测试类

    @AutowiredOrderInfoPrimaryDao orderInfoPrimaryDao;@AutowiredOrderInfoSecondaryDao orderInfoSecondaryDao;public BaseResponse test() {List<OrderInfoPrimary> byOrderId1 = orderInfoPrimaryDao.findByOrderId(7407731806818009176L);List<OrderInfoSecondary> byOrderId2 = orderInfoSecondaryDao.findByOrderId(7407731806818009176L);}

总结

本来是按basePackageClasses的方式实现的,结果两个MongoDB只有一个生效,怀疑是dao在一个包里面的原因,改成放在不同的包里面就正常了。

错误代码:@EnableMongoRepositories(basePackageClasses = orderInfoPrimaryDao.class, mongoTemplateRef = "primaryMongoTemplate")

有效代码:@EnableMongoRepositories(basePackages = "com.xxx.dao.secondary", mongoTemplateRef = "secondaryMongoTemplate")


http://www.mrgr.cn/news/13458.html

相关文章:

  • go 开发小技巧
  • 论文速递 | Operations Research 7月文章合集
  • 开发新系统时,数据库字符集怎么选择对中文的支持最好?
  • 浏览器多开,让WhatsApp多账号管理更高效
  • kotlin协程之 协程概念的具像化
  • 使用推测解码提高 LLM 推理速度
  • 47-java节点流和处理流
  • 利用Python对Excel数据进行条件筛选与排序
  • EmguCV学习笔记 VB.Net 6.4 霍夫变换
  • 第3章 ECMAScript 7 新特性
  • 【习题】ArkUI进阶
  • 算法设计:实验二贪心算法
  • SQL的瑞士军刀:COALESCE与NULLIF的巧用
  • PHP教育培训企业小程序多端平台系统源码
  • Objective-C 中的管道艺术:NSPipe 通信全解析
  • 计算机的错误计算(七十六)
  • HikariPool-1 - Exception during pool initialization报错解决
  • 为什么需要对即将上线的系统进行压力测试
  • 常见的算法底层思想
  • 深入解析:Nginx 中会话持久性问题的解决策略