我们可以用spring boot连接多个mongoDB数据源吗

Posted

技术标签:

【中文标题】我们可以用spring boot连接多个mongoDB数据源吗【英文标题】:can we connect multple mongoDB dataSources with spring boot 【发布时间】:2021-05-14 04:57:44 【问题描述】:

我需要连接两个数据库,两个数据库都是MongoDB数据源,但是IP不同。IP地址我们是动态变化的, 请任何人帮助我

我正在使用 Spring boot + MongoDB,我尝试在一个应用程序中连接两个 MongoDB,但它不起作用。

【问题讨论】:

【参考方案1】:

我用 2 个数据源连接了一个应用程序......但使用关系数据库,使用 jpa......也许配置有效。我将所有更改为 One DbConfig... 如果您需要,只需添加更多并删除 de @Primary 注释

在 jpa 中,命名空间非常重要,但也许你不需要存储库、服务和实体,使用 mongo

@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(entityManagerFactoryRef = "oneEntityManagerFactory",
        basePackages = "com.one.repository", "com.one.service")
public class OneDbConfig 

    public static final String JAVA_COMP_ENV = "java:comp/env/";

    @Value("$one.datasource.jndi-name")
    private String jndi;

    @Primary
    @Bean(name = "oneDataSource")
    @ConfigurationProperties(prefix = "one.datasource")
    public DataSource dataSource() throws NamingException 
        Context initContext = new InitialContext();
        Context envContext = (Context) initContext.lookup(JAVA_COMP_ENV);
        DataSource bds =  (BasicDataSource) envContext.lookup(jndi);
        String url = ((BasicDataSource) bds).getUrl();
        String username = ((BasicDataSource) bds).getUsername();
        String password = ((BasicDataSource) bds).getPassword();
        String driverClass = ((BasicDataSource) bds).getDriverClassName();
        return DataSourceBuilder.create().url(url).username(username).password(password).driverClassName(driverClass).build();
    

    @Primary
    @Bean(name = "oneEntityManagerFactory")
    public LocalContainerEntityManagerFactoryBean entityManagerFactory(
            EntityManagerFactoryBuilder builder, @Qualifier("oneDataSource") DataSource dataSource) 

        Map<String, String> conf = new HashMap<String, String>();
        conf.put("hibernate.connection.datasource", JAVA_COMP_ENV + jndi);
        conf.put("hibernate.id.new_generator_mappings", "false");
        return builder.dataSource(dataSource).packages("com.one.entities").persistenceUnit("one").properties(conf).build();
    

    @Primary
    @Bean(name = "oneTransactionManager")
    public PlatformTransactionManager transactionManager(
            @Qualifier("oneEntityManagerFactory") EntityManagerFactory entityManagerFactory) 
        return new JpaTransactionManager(entityManagerFactory);
    

   


别忘了设置属性...

one.datasource.jndi-name=jdbc/oneDS

【讨论】:

以上是关于我们可以用spring boot连接多个mongoDB数据源吗的主要内容,如果未能解决你的问题,请参考以下文章

连接到多个 mongo db 主机并在 spring boot 中使用不同的数据库进行身份验证

Spring Boot使用mongo的GridFS模块

Dockerize Spring Boot mongo

Docker中的Spring Boot未连接到Docker中的Mongo

spring-data-mongodb 在一个 Mongo 实例中连接多个数据库

基于 Spring WebFlux/Reactive Mongo 的应用程序打开到 mongo db 的多个连接