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

1. 背景说明

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

2. 实现机制

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

设计流程:
在这里插入图片描述
工程结构:
在这里插入图片描述

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

3. 代码实现

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

  1. 先定义统一数据源层接口在这里插入图片描述
    定义数据层接口 IWeatherDao 以及实体 Weather也放置工程里面。

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

  3. 自动化配置机制

    基于Spring Boot的自动化装配机制, 在resources资源目录下面创建META-INF文件夹,定义spring.factories文件, 指向自动装配类。 在这里插入图片描述
    通过@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的自动装载依赖, 以及数据源驱动相关依赖。
    在这里插入图片描述

4. 应用层使用

这里直接创建一个web应用服务
在这里插入图片描述
入口为Controller层, 调用Service层, 然后调用统一接口层:
在这里插入图片描述
POM依赖:
在这里插入图片描述
POM依赖, 引入统一数据层接口, 根据需要引入对应封装的数据源组件即可。

5. 总结

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

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

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

麦神-mirson

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值