基于SpringBoot数据库切换插件

hao-dsrouting-spring-boot-starter

项目地址

项目说明

  • 基于SpringBoot 2.7.7版本
  • hao-dsrouting-spring-boot-starter 是一个轻量级的数据库切换插件,已集成Druid、Hikari数据库连接池

版本信息

  • 核心框架:Spring Boot 2.7.7
  • Druid连接池:Druid 1.2.20
  • HikariCP连接池:HikariCP 4.0.3

环境

  • jdk 8

项目结构

sql 复制代码
hao-dsrouting-spring-boot-starter
├─sql  
│  ├─tend_db.sql 默认库SQL语句
│  ├─tend_db_1.sql 
│  ├─tend_db_2.sql 
│
├─datasource Dsroting 多数据源
|
├─factory 数据源创建工厂
│ 
├─load 数据源连接配置参数加载器

常见问题

1、配置变量

yaml 复制代码
dsrouting:
  # 默认数据源
  default:
    url: jdbc:mysql://xxx.xxx.xxx.xxx:3306/tend_db
    username: xxxx
    password: xxxx
  # PropertiesLoadDataSource模式下数据源配置模式
  dataSources:
    app1:
      url: jdbc:mysql://xxx.xxx.xxx.xxx:3306/tend_db_1
      username: xxxx
      password: xxxx
    app2:
      url: jdbc:mysql://xxx.xxx.xxx.xxx:3306/tend_db_2
      username: xxxx
      password: xxxx
  #druid数据库连接池参数配置
  druid:
    driver-class-name: com.mysql.cj.jdbc.Driver
    initial-size: 5
    min-idle: 5
    max-active: 20
    max-wait: 60000
    time-between-eviction-runs-millis: 60000
    min-evictable-idle-time-millis: 300000
    validation-query: SELECT 1 FROM DUAL
    test-while-idle: true
    test-on-borrow: false
    test-on-return: false
    pool-prepared-statements: true
    max-pool-prepared-statement-per-connection-size: 20
    use-global-data-source-stat: true
    connection-properties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000

  #hikariCP数据库连接池参数配置
  hikari:
    driver-class-name: com.mysql.cj.jdbc.Driver
    initial-size: 5
    min-idle: 5
    max-active: 20
    max-wait: 60000
    time-between-eviction-runs-millis: 60000
    min-evictable-idle-time-millis: 300000
    validation-query: SELECT 1 FROM DUAL
    test-while-idle: true
    test-on-borrow: false
    test-on-return: false
    pool-prepared-statements: true
    max-pool-prepared-statement-per-connection-size: 20
    use-global-data-source-stat: true
    connection-properties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000

2、插件使用

项目文件中,安装当前插件

shell 复制代码
mvn install

项目pom文件中引入当前插件

xml 复制代码
<dependency>
    <groupId>com.hao</groupId>
    <artifactId>hao-dsrouting-spring-boot-starter</artifactId>
    <version>1.0</version>
</dependency>

最后项目启动文件中去除DataSourceAutoConfiguration.class

java 复制代码
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

3、自定义配置

数据源自定义,通过实现LoadDataSourceProperties.java接口,自定义获取数据源方式

java 复制代码
@FunctionalInterface
public interface LoadDataSourceProperties {

    DataSourceProperties load(Object lookupKey);
}

//从默认数据库中获取数据源信息
@Component
public class DbLoadDataSourceProperties implements LoadDataSourceProperties {

    @Autowired
    @Lazy
    private DatabaseTendMapper databaseTendMapper;

    @Override
    public DataSourceProperties load(Object lookupKey) {
        String dataSource = DsroutingContextHolder.getDataSource();
        DsroutingContextHolder.clearDataSource();
        DatabaseTend databaseTend = databaseTendMapper.selectDatabaseTendByDatabaseName(String.valueOf(lookupKey));
        DsroutingContextHolder.setDataSource(dataSource);
        if (null == databaseTend) {
            return null;
        } else {
            DataSourceProperties dataSourceProperties = new DataSourceProperties();
            BeanUtils.copyProperties(databaseTend, dataSourceProperties);
            return dataSourceProperties;
        }
    }
}

数据库连接池自定义,目前已实现Druid、HikariCP两种数据库连接池,可以通过继承AbstractDataSourceFactory.java抽象类,或者实现DataSourceFactory.java接口,实现自定义数据库连接池

java 复制代码
@FunctionalInterface
public interface DataSourceFactory {

    DataSource getObject(DataSourceProperties dataSourceProperties);

}

public abstract class AbstractDataSourceFactory<T> implements DataSourceFactory, EnvironmentAware {
    
    //...
}

//Druid数据库连接池工厂
public class DruidDataSourceFactory extends AbstractDataSourceFactory<DruidDataSource> {

    private static final String DAHO_DRUID_PREFIX = "dsrouting.druid.";

    @Override
    public DataSource getObject(DataSourceProperties dataSourceProperties) {
        DruidDataSource druidDataSource = new DruidDataSource();
        configFromEnvironment(druidDataSource, DAHO_DRUID_PREFIX);
        druidDataSource.setUrl(dataSourceProperties.getUrl());
        druidDataSource.setUsername(dataSourceProperties.getUsername());
        druidDataSource.setPassword(dataSourceProperties.getPassword());
        return druidDataSource;
    }
}

最后

  • 如果喜欢, 谢谢您的关注
相关推荐
㳺三才人子6 小时前
初探 Flask
后端·python·flask·html
星栈独行6 小时前
我在 Rust 全栈项目里用 JWT 做无状态认证
开发语言·后端·rust·前端框架·开源·github·web
Java爱好狂.6 小时前
Java程序员体系化学习路线(2026最新版)
java·后端·java面试·java架构师·java程序员·java八股文·java学习路线
陈随易6 小时前
Redis 8.8发布,一定要更新
前端·后端·程序员
装不满的克莱因瓶7 小时前
SpringBoot 如何将 lib 目录中jar包打包进最终的jar包里面
spring boot·后端·maven·jar·mvn
ltl7 小时前
Transformer 原论文实验结果:为什么 28.4 BLEU 足以改写路线图
后端
excel8 小时前
为什么我推荐使用 Termius:现代 SSH 工具的完整体验
前端·后端
卷毛的技术笔记9 小时前
Java后端硬核实战:用Spring AI Alibaba+Redis给LLM装上“超强记忆中枢”
java·人工智能·redis·后端·spring·ai·系统架构
IT_陈寒10 小时前
Java的Optional差点让我掉坑里,这几个坑你别踩
前端·人工智能·后端
子兮曰10 小时前
Harness 驾驭工程深度教程:从 AGENTS.md 到全链路 AI 编码基础设施
前端·后端·ai编程