技巧 - 借助Druid连接池的MockDriver实现应用的无数据源启动

各式各样的需求。

0. 目录

      • 1. 前言
      • 2. 实现
        • 2.1 方法一:Java配置
        • 2.2 方法二:借助内置的配置文件
      • 3. 注意

1. 前言

技术团队不论大小,一定有一个基础框架,用来封装一些通用功能,以实现快速的业务开发和经验的沉淀;而往往这类基础框架出于实际业务场景,以及自身扩展性等的考虑,都会假定数据库的存在(也就是强依赖于数据库)。

以上背景下,当遇到诸如某些特异业务需求场景,例如这个应用只是用来进行处理其它各方应用的对接交互需求逻辑,而且本应用自身的个性化需求用配置文件即可满足,这个时候如果使用基础框架作为本应用的起步,相关研发人员势必要求去掉对于实际数据库的依赖(我一共就写两个对接接口,还得专门去部署个数据库,你这能玩不能玩,不行我自己去整个servlet拉到,别拿什么技术统一来压人,这点需求都满足不了就别整大义)。

没错,以上就是大量中小型业务型软件公司的现状。

为了让基础框架能够尽量铺开,来获取尽量多的实际项目反馈,我们需要直面这个需求 —— 让应用在无实际数据库支撑的情况下正常启动

2. 实现

实际的解决方案其实很简单,业界对此已经有了极其成熟的解决思路 —— Mock。所以本文的重点在基于Druid提供的成熟解决方案基础上如何使用,方便后来者快速实现,毕竟能找到这来的同学肯定不是来研究原理的。

2.1 方法一:Java配置

本方法的思路: 通过提供外部自定义的配置项,实现快速切换。优点是接入快捷,只需要修改一个配置项设置"是否启用",缺点则是增加了额外的配置项,学习成本增加。

@Bean(initMethod="init")
@ConfigurationProperties("spring.datasource.druid.master")
public DataSource masterDataSource(DruidProperties druidProperties) {
     
	final DruidDataSource dataSource = DruidDataSourceBuilder.create().build();
    // 根据自定义的配置项, 来设置是否需要Mock启动; 这个值从外围配置文件读取而来
	if(isMock){
     
		dataSource.setDriver(MockDriver.instance);
	}
	return druidProperties.dataSource(dataSource);
}

2.2 方法二:借助内置的配置文件

本方法的思路: 完全基于Druid连接池提供的内置功能,只使用配置文件来实现。优点是无需增加额外的配置项,缺点是每次变动都需要修改配置文件。

# 实现方式一
spring:
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    # 特意设置为空, 让druid自行根据 jdbcUrl 判断Driver;相关实现源码参见: DruidDataSource.resolveDriver()
    driverClassName:
    druid:
      # 主库数据源
      master:
        # 以 jdbc:fake: 开头即可, 后面的部分可有可无 ;相关实现源码参见: MockDriver.acceptsURL(String) 
        url: jdbc:fake://
        # 下面这两在mock下不会生效
        username: xxx
        password: xxx

# 实现方式二
spring:
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    # 显式设置
    driverClassName: com.alibaba.druid.mock.MockDriver
    # 其它的配置就无所谓了..
    # ......

3. 注意

  1. 应用中不能有启动完毕,更不能有启动过程中进行真实数据库查询的操作;当然你强行要实现的话也是可以Mock的。

你可能感兴趣的:(druid,java,spring,druid)