基于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;
    }
}

最后

  • 如果喜欢, 谢谢您的关注
相关推荐
Anastasiozzzz1 天前
对抗大文件上传---分片加多重Hash判重
服务器·后端·算法·哈希算法
Vivienne_ChenW1 天前
DDD领域模型在项目中的实战
java·开发语言·后端·设计模式
女王大人万岁1 天前
Go标准库 sync 详解
服务器·开发语言·后端·golang
小高Baby@1 天前
session、cookie、Jwt-token
开发语言·后端·golang
露天赏雪1 天前
JDK8 的入门避坑指南
java·服务器·windows·spring boot·后端·spring·性能优化
爬山算法1 天前
Hibernate(86)如何在性能测试中使用Hibernate?
java·后端·hibernate
菜鸟小杰子1 天前
Spring Boot集成asyncTool:复杂任务的优雅编排与高效执行(实战优化版)
java·spring boot·后端
rannn_1111 天前
【苍穹外卖|Day3】公共字段自动填充、新增菜品功能、菜品分页查询功能、删除菜品功能、修改菜品功能、起售停售菜品
java·spring boot·后端·学习·项目
无名-CODING1 天前
SpringMVC处理流程完全指南:从请求到响应的完整旅程
java·后端·spring
BYSJMG1 天前
计算机毕设推荐:基于大数据的共享单车数据可视化分析
大数据·后端·python·信息可视化·数据分析·课程设计