代码之家  ›  专栏  ›  技术社区  ›  Jean Cedron

在Spring Boot中使用两个数据源

  •  7
  • Jean Cedron  · 技术社区  · 8 年前

    我正在使用 Spring Boot 1.3.3 在我的项目中 数据库,现在我想使用两个数据库 相同模式 但是 不同的连接 .

    我希望使用相同的存储库和实体,并根据情况找到告诉spring我要使用哪个数据源的方法。

    1 回复  |  直到 8 年前
        1
  •  8
  •   Jean Cedron    8 年前

    如果有人有这个问题,我已经找到了解决方案:

    首先,你 application.properties 应该是这样的:

    datasource:
    primary:
        url: jdbc:mysql://localhost:3306/primary_db
        username: your_username
        password: your_password
        driver-class-name: com.mysql.jdbc.Driver
    secondary:
        url: jdbc:mysql://localhost:3306/secondary_db
        username: your_username
        password: your_password
        driver-class-name: com.mysql.jdbc.Driver
    

    之后,您必须使用数据库创建一个枚举:

    public enum Database {
        PRIMARY,
        SECONDARY
    }
    

    public class DatabaseThreadContext {
    
        private static final ThreadLocal<Database> current = new ThreadLocal<>();
    
        public static void setCurrentDatabase(Database database) {
            current.set(database);
        }
    
        public static Object getCurrentDatabase() {
            return current.get();
        }
    
    }
    

    AbstractRoutingDataSource

    public class RoutingDataSource extends AbstractRoutingDataSource {
    
        @Override
        protected Object determineCurrentLookupKey() {
            return DatabaseThreadContext.getCurrentDatabase();
        }
    
    }
    

    最后,在Spring Boot应用程序中注入配置:

    @Configuration
    public class DatabaseRouter {
    
        @Bean
        @ConfigurationProperties(prefix="datasource.primary")
        public DataSource primaryDataSource() {
            return DataSourceBuilder.create().build();
        }
    
        @Bean
        @ConfigurationProperties(prefix="datasource.secondary")
        public DataSource secondaryDataSource() {
            return DataSourceBuilder.create().build();
        }
    
        @Bean
        @Primary
        public DataSource dataSource() {
            Map<Object, Object> targetDatasources = new HashMap<Object, Object>(){{
                put(Database.SECONDARY, secondaryDataSource());
                put(Database.PRIMARY, primaryDataSource());
            }};
            RoutingDataSource routingDataSource = new RoutingDataSource();
            routingDataSource.setDefaultTargetDataSource(primaryDataSource());
            routingDataSource.setTargetDataSources(targetDatasources);
            routingDataSource.afterPropertiesSet();
            return routingDataSource;
        }
    
    }
    

    在每个请求中,如果要在数据库之间进行更改,只需使用以下功能: DatabaseThreadContext.setCurrentDatabase(Database.PRIMARY); .

    此外,您可以同时拥有两个以上的数据库。