基于Spring Boot自动化装配机制实现多数据库适配

1. 背景说明

一个应用服务可能会用到多种数据库,可以采用多版本方式去管理运作,实际当中,同一套数据库版本可能又会适配不同的客户需求, 这时候再增加版本去维护会比较复杂, 不利于维护,有没办法根据配置去采用不同的数据库, 只要针对客户一个维度去维护版本即可。

2. 实现机制

要能够适配不同数据库, 数据层需定义统一的接口,由具体的数据库组件做实现,对上游调用Service来讲是透明的。

设计流程:
基于Spring Boot自动化装配机制实现多数据库适配_第1张图片
工程结构:
基于Spring Boot自动化装配机制实现多数据库适配_第2张图片

技术上通过Spring Boot 自动化装配机制去实现不同数据库的适配, 由条件化配置去决定采用哪种数据源, 不配置的数据源不进行加载, 减少资源占用。

3. 代码实现

这里以适配TDEngine数据为例,提供一个天气的操作接口, 演示如何封装实现。

  1. 先定义统一数据源层接口基于Spring Boot自动化装配机制实现多数据库适配_第3张图片
    定义数据层接口 IWeatherDao 以及实体 Weather也放置工程里面。

  2. 创建TDEngine的数据适配工程
    基于Spring Boot自动化装配机制实现多数据库适配_第4张图片
    这里面定义了底层DAO数据层的操作接口IWeatherMapper,里面只提供增删改操作; 但不同数据的适配可能会有差异,比如属性类型的转换, 语法差异, 这就需要再增加一个适配层adapter, 通过WeatherDaoAdapter进行适配:
    基于Spring Boot自动化装配机制实现多数据库适配_第5张图片
    这里引入了底层IWeatherMapper接口,对于TDEngine数据库的特性, 在Adapter层进行适配, 由于时序数据库必须要记录时间, 增加了时间的处理。

  3. 自动化配置机制

    基于Spring Boot的自动化装配机制, 在resources资源目录下面创建META-INF文件夹,定义spring.factories文件, 指向自动装配类。 基于Spring Boot自动化装配机制实现多数据库适配_第6张图片
    通过@SpringBootApplication中的@EnableAutoConfiguration注解会自动扫描装载, 不需要再配置@ComponentScan扫描。

  4. 数据源自动装配实现

    代码:

    @Configuration
    @ComponentScan("com.mirson.unifydao.dp.tdengine")
    @MapperScan(basePackages = "com.mirson.unifydao.dp.tdengine.dao", sqlSessionTemplateRef = "sqlSessionTemplate", sqlSessionFactoryRef = "sql SessionFactory")
    @ConditionalOnProperty(name = "spring.datasource.driverClassNane", havingValue = "com.taos data.jdbc.TSDBDriver")
    public class AutoTdengineConfiguration {
    
    
        /**
         * sql session工厂配置
         *
         * @param dataSource
         * @return
         * @throws Exception
         */
        @Bean
        public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception {
            SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
            bean.setDataSource(dataSource);
            bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:com/mir son/unify dao/dp/td engine/dao/mapper/*Mapper.xml");
            return bean.getObject();
        }
    
        @Bean
        @ConfigurationProperties(prefix = "spring.datasource")
        public DruidDataSource druidDataSource() {
            return new DruidDataSource();
        }
    
        /**
         * DataSource事务管理器
         *
         * @param dataSource
         * @return
         */
        @Bean
        public DataSourceTransactionManager dataSourceTransactionManager(DataSource dataSource) {
            return new DataSourceTransactionManager(dataSource);
        }
    
        /**
         * Mybatis与Spring的SQLSESSION管理器
         *
         * @param sqlSessionFactory
         * @return
         * @throws Exception
         */
        @Bean
        public SqlSessionTemplate sqlSessionTemplate(SqlSessionFactory sqlSessionFactory) throws Exception {
            return new SqlSessionTemplate(sqlSessionFactory);
        }
    }
    
    

    通过@ConditionalOnProperty条件化注解控制, 决定是否初始化数据源配置, 如果不符合条件, 不会加载占用额外开销。

    @MapperScan要指定dao的路径,否则不能有效初始化数据源,@ComponentScan扫描路径也要指定,因为需要加载adapter数据适配层。

  5. POM依赖配置

    加入spring boot的自动装载依赖, 以及数据源驱动相关依赖。
    基于Spring Boot自动化装配机制实现多数据库适配_第7张图片

4. 应用层使用

这里直接创建一个web应用服务
基于Spring Boot自动化装配机制实现多数据库适配_第8张图片
入口为Controller层, 调用Service层, 然后调用统一接口层:
基于Spring Boot自动化装配机制实现多数据库适配_第9张图片
POM依赖:
基于Spring Boot自动化装配机制实现多数据库适配_第10张图片
POM依赖, 引入统一数据层接口, 根据需要引入对应封装的数据源组件即可。

5. 总结

基于Spring Boot 自动化机制实现的多数据源配置, 对于研发人员来讲, 只需维护一个版本即可,即便某个数据源组件升级,也不会影响其他数据源的使用。

对于应用方来讲,不用关心具体是采用哪种数据源, 只需调用统一数据层接口即可,由底层做具体适配实现,能够做到灵活配置与扩展。即便引入了多个数据源组件,会根据系统配置,初始化某一个数据源,其他数据源不会初始化,也不会由此造成资源开销或冲突。

你可能感兴趣的:(Spring,Cloud,自动化,数据库,运维)