基于SpringBoot实现动态配置数据库的加载

 更新时间:2024年10月11日 08:30:31   作者:离开地球表面_99  
这篇文章主要介绍了Spring Boot 如何动态配置数据库的加载,现项目有一个需求,期望通过在application.yml配置文件中设置一个开关,来决定是否加载数据库,文中通过代码示例讲解的非常详细,需要的朋友可以参考下

1. 背景

现项目有一个需求,期望通过在application.yml配置文件中设置一个开关,来决定是否加载数据库。要求:

  • 当开关的值为true时加载数据库;

  • 当开关的值为false或没有该配置时则不加载数据库。

2. 具体实现

2.1 数据库相关配置

application.yml中添加配置spring.datasource.enabled来决定是否加载数据库相关配置。

spring:
  datasource:
    #开启MySQL
    enabled: true
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/test?createDatabaseIfNotExist=true&useSSL=false&serverTimezone=GMT%2b8&characterEncoding=utf8&connectTimeout=30000&socketTimeout=30000&autoReconnect=true&cachePrepStmts=true&useServerPrepStmts=true
    username: root
    password: 123456
    type: com.zaxxer.hikari.HikariDataSource
    hikari:
      # 连接池名称
      pool-name: MyHikariCP
      #最小空闲连接,默认值10,小于0或大于maximum-pool-size,都会重置为maximum-pool-size
      minimum-idle: 10
      #连接池最大连接数,默认是10 (cpu核数量 * 2 + 硬盘数量)
      maximum-pool-size: 30
      #空闲连接超时时间,默认值600000(10分钟),大于等于max-lifetime且max-lifetime>0,会被重置为0;不等于0且小于10秒,会被重置为10秒。
      idle-timeout: 600000
      #连接最大存活时间,不等于0且小于30秒,会被重置为默认值30分钟.设置应该比mysql设置的超时时间短
      max-lifetime: 1800000
      #连接超时时间:毫秒,小于250毫秒,否则被重置为默认值30秒
      connection-timeout: 30000
      #用于测试连接是否可用的查询语句
      connection-test-query: SELECT 1

  jpa:
    database: mysql
    show-sql: false
    hibernate:
      naming:
        physical-strategy: org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
      ddl-auto: update
    properties:
      hibernate:
        jdbc:
          batch_size: 100
        dialect: org.hibernate.dialect.MySQL5InnoDBDialect
        enable_lazy_load_no_trans: true
    open-in-view: false

2.2 启动类添加注解

启动类添加注解@SpringBootApplication(exclude = { DataSourceAutoConfiguration.class }), 代表默认情况下不自动加载数据库相关配置。

@SpringBootApplication(exclude = { DataSourceAutoConfiguration.class })
public class OcrsrvcApplication {
    public static void main(String[] args) {
        SpringApplication.run(OcrsrvcApplication.class, args);
    }
}

2.3 新增DataSourceConfig配置类

新增数据源配置类,用于自定义数据源的创建。

使用注解@ConditionalOnProperty,这样可以根据特定属性的值来决定是否加载某个组件。

@Configuration
@ConditionalOnProperty(name = "spring.datasource.enabled", havingValue = "true")
@Slf4j
public class DataSourceConfig {

    @Value("${spring.datasource.url}")
    private String jdbcUrl;

    @Value("${spring.datasource.driver-class-name}")
    private String driverClassName;

    @Value("${spring.datasource.username}")
    private String username;

    @Value("${spring.datasource.password}")
    private String password;

    @Value("${spring.datasource.hikari.pool-name}")
    private String poolName;

    @Value("${spring.datasource.hikari.minimum-idle}")
    private int minimumIdle;

    @Value("${spring.datasource.hikari.maximum-pool-size}")
    private int maximumPoolSize;

    @Value("${spring.datasource.hikari.idle-timeout}")
    private long idleTimeout;

    @Value("${spring.datasource.hikari.max-lifetime}")
    private long maxLifetime;

    @Value("${spring.datasource.hikari.connection-timeout}")
    private long connectionTimeout;

    @Value("${spring.datasource.hikari.connection-test-query}")
    private String connectionTestQuery;

    @Bean
    public DataSource dataSource() {

        log.info("====加载数据库===");
        HikariConfig hikariConfig = new HikariConfig();

        hikariConfig.setJdbcUrl(jdbcUrl);
        hikariConfig.setDriverClassName(driverClassName);
        hikariConfig.setUsername(username);
        hikariConfig.setPassword(password);
        hikariConfig.setPoolName(poolName);
        hikariConfig.setMinimumIdle(minimumIdle);
        hikariConfig.setMaximumPoolSize(maximumPoolSize);
        hikariConfig.setIdleTimeout(idleTimeout);
        hikariConfig.setMaxLifetime(maxLifetime);
        hikariConfig.setConnectionTimeout(connectionTimeout);
        hikariConfig.setConnectionTestQuery(connectionTestQuery);

        return new HikariDataSource(hikariConfig);
    }
}

2.4 相关业务逻辑调整

涉及到使用数据库的相关业务逻辑,可在XxxRepository类上添加注解@ConditionalOnProperty(name = "spring.datasource.enabled", havingValue = "true") ,这代表只有在启用数据库时,才会加载相应组件。

使用注解@Autowired(required = false)注入XxxRepository,代表允许为空,避免Bean不存在时出错

@Autowired(required = false)  
private XxxRepository xxxRepository;

到此这篇关于基于SpringBoot实现动态配置数据库的加载的文章就介绍到这了,更多相关SpringBoot配置数据库的加载内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 基于Properties类操作.properties配置文件方法总结

    基于Properties类操作.properties配置文件方法总结

    这篇文章主要介绍了Properties类操作.properties配置文件方法总结,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-09-09
  • @Conditional注解的使用场景和源码解析

    @Conditional注解的使用场景和源码解析

    这篇文章主要介绍了@Conditional注解的使用场景和源码解析,@Conditional是一个条件注解,它的作用是判断Bean是否满足条件,如果满足条件,则将Bean注册进IOC中,如果不满足条件,则不进行注册,需要的朋友可以参考下
    2023-11-11
  • Java必备知识之位运算及常见进制解读

    Java必备知识之位运算及常见进制解读

    从现代计算机中所有的数据二进制的形式存储在设备中。即 0、1 两种状态,计算机对二进制数据进行的运算(+、-、*、/)都是叫位运算,即将符号位共同参与运算的运算
    2021-10-10
  • mybatis-plus自动装配时间失效的解决

    mybatis-plus自动装配时间失效的解决

    本文主要介绍了mybatis-plus自动装配时间失效,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-04-04
  • SpringBoot多环境开发与日志小结

    SpringBoot多环境开发与日志小结

    这篇文章主要介绍了SpringBoot多环境开发与日志,下面给大家说一下如何基于多环境开发做配置独立管理,务必掌握,需要的朋友可以参考下
    2022-08-08
  • Java线程池执行过程中遇到异常的原因和解决办法

    Java线程池执行过程中遇到异常的原因和解决办法

    当线程池中线程频繁出现未捕获的异常,那线程的复用率就大大降低了,需要不断地创建新线程,所以本文通过详细的代码给大家介绍了Java线程池执行过程中遇到异常的解决办法,需要的朋友可以参考下
    2025-10-10
  • 基于Maven pom文件中属性变量总结

    基于Maven pom文件中属性变量总结

    这篇文章主要介绍了Maven pom文件中属性变量总结,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12
  • Springboot之日志、配置文件、接口数据如何脱敏

    Springboot之日志、配置文件、接口数据如何脱敏

    本文主要介绍了Springboot之配置文件数据脱敏、接口返回数据脱敏、日志文件数据脱敏三个方面,需要了解学习的小伙伴快跟随小编的脚步一起去看看吧
    2021-09-09
  • MybatisPlus如何调用count函数

    MybatisPlus如何调用count函数

    这篇文章主要介绍了MybatisPlus如何调用count函数问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-08-08
  • 原来Java中有两个ArrayList

    原来Java中有两个ArrayList

    原来Java中有两个ArrayList,本文就带着大家一起探究Java中的ArrayList,感兴趣的小伙伴们可以参考一下
    2016-01-01

最新评论