【问题标题】:spring boot multiple data sourcesspring boot 多数据源
【发布时间】:2017-10-26 15:49:07
【问题描述】:

我试图按照this 链接在我的应用程序中配置两个数据库。

在最近的春天,我们没有org.springframework.boot.autoconfigure.jdbc.TomcatDataSourceConfiguration 类。

有什么替代方法可以使用。

我正在为我的 Spring Boot 应用程序使用 gradle

【问题讨论】:

    标签: spring-boot datasource


    【解决方案1】:

    我更喜欢使用“org.apache.tomcat.jdbc.pool.DataSource”,然后手动配置我的数据源。

    org.apache.tomcat.jdbc.pool.DataSource dataSource = new org.apache.tomcat.jdbc.pool.DataSource();
    

    我设置了完全限定名称,因为您应该从您创建的任何工厂方法返回“javax.sql.DataSource”。

    使用 spring-boot 自动配置获取多个数据源是一件很容易的事情,因为固执己见的观点是您应该为每个数据源创建不同的服务。

    这并不总是可能的,所以当我在单个应用程序中需要多个 DataSource 时,我会这样做。

    像这样禁用自动配置:

    @SpringBootApplication(exclude = DataSourceAutoConfiguration.class)
    public class YourApp{}
    

    为您的数据源创建配置属性:

    属性文件:

    the-first.datasource.url=<insert value>
    the-first.datasource.username=<insert value>
    the-first.datasource.pw=<insert value>
    the-first.datasource.min-idle=<insert value>
    the-first.datasource.max-idle=<insert value>
    the-first.datasource.max-active=<insert value>
    the-first.datasource.validation-query=SELECT 1
    # etc ...
    the-second.datasource.url=<insert value>
    the-second.datasource.username=<insert value>
    the-second.datasource.pw=<insert value>
    the-second.datasource.min-idle=<insert value>
    the-second.datasource.max-idle=<insert value>
    the-second.datasource.max-active=<insert value>
    the-second.datasource.validation-query=SELECT 1
    

    配置类:

    import lombok.*;
    import org.springframework.boot.context.properties.ConfigurationProperties;
    import org.springframework.stereotype.Component;
    
    @Getter
    @Setter
    @NoArgsConstructor
    @AllArgsConstructor
    @Component("theFirstDataSourceProperties")
    @ConfigurationProperties("the-first.datasource")
    public class TheFirstDataSourceProperties{
    
        @NonNull
        private String password;
    
        @NonNull
        private String url;
    
        @NonNull
        private String username;
    
        private int minIdle;
    
        private int maxIdle;
    
        private int maxActive;
    
        @NonNull
        private String driverClassName;
    
        @NonNull
        private String validationQuery;
    }
    

    添加数据源配置类:

    确保将其中一个标记为“@Primary”以帮助注入。

    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    
    import javax.sql.DataSource;
    
    /**
     * Copyright ${year}
     *
     * @author J. Keith Hoopes
     */
    @Configuration
    public class ExampleOfMultipleDataSourceConfiguration{
    
        @Bean(name = "theFirstDataSource")
        @Primary
        @Autowired
        public DataSource theFirstDataSource(
            TheFirstDataSourceProperties theFirstDataSourceProperties){
    
            //Fully qualified to not conflict with generic DataSource
            org.apache.tomcat.jdbc.pool.DataSource dataSource = new org.apache.tomcat.jdbc.pool.DataSource();
            // General
            dataSource.setName("theFirstDataSourceName");
            dataSource.setDriverClassName(theFirstDataSourceProperties.getDriverClassName());
            // etc ....
    
            return dataSource;
        }
    
        @Bean(name = "bDataSource")
        @Autowired
        public DataSource theSecondDataSource(
            TheSecondDataSourceProperties theSecondDataSourceProperties){
    
            //Fully qualified to not conflict with generic DataSource
            org.apache.tomcat.jdbc.pool.DataSource dataSource = new org.apache.tomcat.jdbc.pool.DataSource();
            // General
            dataSource.setName("theSecondDataSourceName");
            dataSource.setDriverClassName(theSecondDataSourceProperties.getDriverClassName());
            // etc ....
    
            return dataSource;
        }
    }
    

    使用@Qualifier 在需要的地方注入您的自定义数据源,以便获得正确的数据源:)

    @Qualifier("theFirstDataSource")
    

    利润?是的。

    哦,这是我使用的基本依赖项。

    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-configuration-processor</artifactId>
    </dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-configuration-metadata</artifactId>
    </dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-jdbc</artifactId>
    </dependency>
    <dependency>
      <groupId>net.sourceforge.jtds</groupId>
      <artifactId>jtds</artifactId>
    </dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-tomcat</artifactId>
      <scope>provided</scope>
    </dependency>
    

    【讨论】:

    • 这对我帮助很大。我有一个问题。创建的第二个数据源应该用于保存弹簧数据表。我怎样才能做到这一点。我有一个返回 JobRepository 的方法,在里面我使用 JobRepositoryFactoryBean 来设置数据源和数据库类型等。
    • 您需要用“@Primary”标记其中一个数据源,然后在需要的地方注入它时使用“@Qualifier”。我建议专门为数据表创建一个单独的帖子,以便您可以获得更多更好的关于如何处理的建议。
    • 另外,如果你在 github 上有一个示例/示例项目,我不介意尝试一下。
    • 我可以使用上述连接到不同的架构。但是当我的 JobRepositoryFactoryBean 被执行时,它会选择新的模式,但将所有 spring 批处理表保存到我的旧模式
    • 我真的需要看一个示例项目来帮助你更多,我认为这样做会很有趣。