Spring Boot 3多数据源配置+Druid监控,看这篇就够了

Spring Boot 3多数据源配置+Druid监控,看这篇就够了

一、开篇

家人们,最近在项目里搞 Spring Boot 3 整合多数据源和 Druid,这过程简直像西天取经,各种妖魔鬼怪(问题)层出不穷!尤其是配置监控页面和控制台 SQL 日志的时候,我感觉自己头发都快薅没了。一会儿监控页面 404,提示 "No static resource druid." ,像是在跟我玩捉迷藏;一会儿控制台又死活不打印 SQL,只有出错的时候才冒个泡,让人干着急。

我在网上一顿狂搜,各种博客、论坛翻了个底朝天,照着教程改了无数次配置,可还是不行,感觉自己像只无头苍蝇。但咱是谁,哪能这么轻易放弃!经过无数次的重启项目、逐行翻看源码、研究 Issue,我终于把这套配置给整明白了!现在监控页面完美展示,多数据源切换丝滑顺畅,控制台 SQL 日志还能带着参数打印,不管是正常执行还是出错的 SQL 都能看得清清楚楚。

今天我就把这份来之不易的经验分享出来,全是干货,直接复制粘贴就能跑起来,希望能帮大家少走点弯路!

二、Spring Boot 3 简介

Spring Boot 3 作为 Spring 框架的最新版本,可谓是集众多优势于一身,在简化开发、提高效率方面堪称一绝。它就像一个贴心的助手,遵循 "约定优于配置" 的原则,让开发者可以从繁琐的配置细节中解脱出来,专注于业务逻辑的实现。比如说,以前配置一个 Spring 应用,可能需要在 XML 文件里写一大堆配置代码,现在有了 Spring Boot 3,很多配置都能自动完成,几行代码就能搞定,开发效率直线上升。

在依赖管理上,Spring Boot 3 也有一手,自带的依赖管理功能,能自动引入项目所需的依赖,避免了版本冲突等常见问题。就好比搭积木,每个积木(依赖)都能精准地找到自己的位置,轻松搭建出稳固的项目架构。而且它内置了 Tomcat、Jetty 或 Undertow 服务器,部署过程变得超级简单,不再需要复杂的服务器配置步骤,真正实现了 "开箱即用" 。同时,Actuator 模块的加持,让应用的健康状态监控变得轻而易举,就像给应用安装了一个健康监测仪,随时掌握它的运行状况。另外,Spring Boot 3 对微服务架构的支持也非常出色,和 Spring Cloud 等框架搭配使用,能轻松构建出复杂且健壮的微服务应用 。

三、多数据源的概念与应用场景

多数据源,简单来说,就是在一个应用程序中同时连接和使用多个数据库数据源 。就像一家大型超市,它有多个仓库(数据源),每个仓库存储着不同种类的商品(数据),为了满足顾客多样化的购物需求,超市需要管理好这些仓库,确保商品的及时调配和供应。在软件开发中,随着业务的不断扩展和复杂度的增加,单一数据源往往无法满足所有的业务需求,多数据源就应运而生。

在实际应用中,多数据源有着丰富的应用场景。以电商系统为例,分库分表是一种常见的需求。随着用户数量和订单数据的爆炸式增长,单库单表的存储方式会导致查询效率急剧下降,就像一个小仓库堆满了货物,找东西变得异常困难。这时,就需要将数据按照一定的规则(如用户 ID、订单时间等)分布到多个数据库和表中,每个数据库和表就构成了一个数据源,这样可以大大提高数据的读写性能 。

再比如读写分离,在高并发的业务场景下,读操作(查询数据)的频率往往远高于写操作(插入、更新、删除数据)。为了减轻主数据库的压力,提高系统的整体性能,可以将读操作和写操作分别分配到不同的数据库上,主库负责写操作,从库负责读操作,这就形成了多数据源架构。主库和从库就像两个不同的工作岗位,各司其职,确保系统的高效运行。

此外,当企业进行业务整合时,可能需要将不同部门或不同业务系统的数据进行融合。例如,销售部门的数据存储在一个数据库中,财务部门的数据存储在另一个数据库中,为了进行全面的业务分析,就需要在应用中配置多个数据源,实现数据的统一查询和处理,让不同部门的数据能够相互协作,为企业决策提供更全面的支持。

四、Druid 是什么

Druid 是阿里巴巴开源的一款数据库连接池,在 Java 开发领域那可是相当有名,有着 "数据库连接池之王" 的美誉 。它就像一个智能的管家,负责管理数据库连接的创建、分配、回收等工作,让应用程序与数据库之间的交互更加高效、稳定。

Druid 的功能十分强大。在监控方面,它提供了丰富的监控数据,通过内置的监控页面,我们可以实时查看数据库连接池的运行状态,比如当前活跃的连接数、连接池的使用情况、历史峰值等,就像给数据库连接池安装了一个实时监控摄像头,一切运行情况尽收眼底。同时,还能展示最近执行的 SQL 语句及其执行时间、频率等信息,帮助我们快速定位执行缓慢的 SQL 语句,进行针对性优化 。

在扩展性上,Druid 也毫不逊色,它支持通过过滤器进行定制化扩展,就像给一个房子添加不同功能的房间,满足各种特殊需求。例如,通过 SQL 防火墙过滤器(WallFilter),可以对 SQL 语句进行语义分析,判断是否存在危险操作(如 DROP TABLE 等),有效防止 SQL 注入攻击,为数据库安全保驾护航;日志过滤器(LogFilter)则可以详细记录连接使用情况和 SQL 执行日志,还支持参数脱敏,方便我们进行调试和审计 。

另外,Druid 在性能上也表现卓越。它采用了先进的连接池算法,能够根据业务需求动态调整连接池的大小,合理地控制连接池中连接的数量,避免过多的连接创建导致数据库资源耗尽,确保在高并发场景下也能有足够的可用连接,保障系统的响应速度 。同时,它还具备连接泄漏检测机制,如果某个数据库连接长时间未被正确释放,Druid 能够及时检测出来,并通过日志等方式提醒开发人员,有助于快速定位代码中可能存在的资源管理漏洞,防止因连接泄漏而引发的数据库性能下降等问题 。

总的来说,Druid 凭借其强大的监控功能、出色的扩展性和高性能,成为众多 Java 项目在数据库连接池选择上的热门之选,尤其适合对数据库性能监控和安全防护有较高要求的项目 。

五、环境搭建与依赖配置

(一)搭建 Spring Boot 3 项目

首先,打开 IDEA 这款强大的开发工具,点击菜单栏中的 "File",选择 "New",再点击 "Project"。在弹出的新建项目窗口中,左侧选择 "Spring Initializr",这就像是一个快速搭建 Spring 项目的魔法工具 。点击 "Next" 后,填写项目的基本信息,比如 "Group" 可以填写公司或组织的域名反写,"Artifact" 则是项目的名称,这里假设我们的项目叫 "multi-datasource-druid-demo" 。

接着,在 "Spring Boot Version" 中选择 3.x 版本,注意哦,Spring Boot 3 最低支持 Java 17,所以要确保你的 Java 环境是符合要求的。再点击 "Next",就进入到依赖选择界面啦。在这里,我们先勾选 "Spring Web" 依赖,它就像一个桥梁,能帮我们快速搭建 Web 应用,让项目具备处理 HTTP 请求的能力;然后选择 "Lombok",这个依赖可神奇了,它能通过注解自动生成 JavaBean 的 Getter、Setter、ToString 等方法,减少我们的代码量,提高开发效率 ;还需要添加 "MySQL Driver",它是连接 Java 应用和 MySQL 数据库的关键,就像一根数据线,让两者能够顺利通信;另外,"MyBatis Framework" 也别落下,它是一个优秀的持久层框架,能方便地进行数据库操作,实现对象和关系数据之间的映射 。选好这些依赖后,点击 "Finish",IDEA 就会自动帮我们生成一个 Spring Boot 3 项目的基础结构,是不是很简单!

如果你不想用 IDEA,也可以直接访问 Spring Initializr 的官网(start.spring.io/ ),在网页上进行同样的项目创建操作。在官网页面,按照提示依次填写项目的各项信息,选择依赖,最后点击 "Generate" 按钮,就能下载一个压缩包,解压后就是我们的 Spring Boot 3 项目啦 。

(二)添加依赖

项目创建好后,我们还需要添加一些关键的依赖。打开项目中的pom.xml文件,这是项目的依赖管理文件,就像一个购物清单,记录着项目需要的各种 "物品"(依赖) 。

首先,添加 Druid Starter 依赖,代码如下:

xml 复制代码
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid-spring-boot-starter</artifactId>
    <version>1.2.16</version>
</dependency>

这个依赖可是重中之重,它是 Druid 连接池在 Spring Boot 项目中的集成工具,有了它,我们就能轻松使用 Druid 强大的功能,比如数据库连接池管理、监控统计、SQL 防火墙等 。

接着,添加 MySQL 驱动依赖,代码如下:

xml 复制代码
<dependency>
    <groupId>com.mysql</groupId>
    <artifactId>mysql-connector-j</artifactId>
    <scope>runtime</scope>
</dependency>

前面提到过,它是 Java 程序与 MySQL 数据库之间通信的桥梁,负责将 Java 代码中的 SQL 语句发送给 MySQL 数据库,并将数据库返回的结果传递回 Java 程序 。

然后,根据实际需求添加多个数据源的相关依赖,这里以使用 Spring Boot 提供的spring-boot-starter-jdbc为例:

xml 复制代码
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>

这个依赖主要用于操作数据库,支持多数据源配置,方便我们在项目中管理和使用多个数据库连接 。

另外,如果项目中使用了 MyBatis,还需要添加 MyBatis 相关依赖,如下:

xml 复制代码
<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>3.0.3</version>
</dependency>

它能将 MyBatis 框架与 Spring Boot 完美整合,让我们可以更便捷地使用 MyBatis 进行数据库操作,比如编写 SQL 语句、映射结果集等 。

添加完这些依赖后,Maven 会自动下载并管理它们,我们就可以开始进行下一步的配置工作啦 。

六、多数据源配置实战

(一)配置文件编写

application.yml配置文件中,我们要配置多个数据源的相关信息。这里以配置主数据源(master)和从数据源(slave)为例,代码如下:

yaml 复制代码
spring:
  datasource:
    dynamic:
      primary: master
      strict: false
      datasource:
        master:
          driver-class-name: com.mysql.cj.jdbc.Driver
          url: jdbc:mysql://localhost:3306/master_db?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=UTC
          username: root
          password: 123456
          type: com.alibaba.druid.pool.DruidDataSource
          initial-size: 5
          min-idle: 5
          max-active: 20
          max-wait: 60000
          filters: stat,wall,slf4j
        slave:
          driver-class-name: com.mysql.cj.jdbc.Driver
          url: jdbc:mysql://localhost:3306/slave_db?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=UTC
          username: root
          password: 123456
          type: com.alibaba.druid.pool.DruidDataSource
          initial-size: 5
          min-idle: 5
          max-active: 20
          max-wait: 60000
          filters: stat,wall,slf4j

在这段配置中,spring.datasource.dynamic.primary指定了默认使用的数据源为masterspring.datasource.dynamic.strict设置为false,表示当找不到指定数据源时,不会抛出异常,而是使用默认数据源,这样可以增加系统的容错性 。

spring.datasource.dynamic.datasource.masterspring.datasource.dynamic.datasource.slave分别配置了主数据源和从数据源的详细信息。其中,driver-class-name指定了 MySQL 数据库的驱动类;url是数据库的连接地址,包含了数据库名、字符编码、SSL 设置以及时区设置等参数;usernamepassword是连接数据库的用户名和密码;type指定了使用 Druid 数据源;initial-size表示初始化时连接池的大小,就像一个仓库一开始准备的货物数量;min-idle是最小空闲连接数,保证随时有一定数量的连接可用;max-active是最大活跃连接数,限制连接池最多能创建的连接数量;max-wait是获取连接时的最大等待时间,超过这个时间还获取不到连接就会抛出异常;filters配置了 Druid 的过滤器,stat用于统计 SQL 执行情况,wall作为 SQL 防火墙,防止 SQL 注入攻击,slf4j则用于日志记录,方便我们查看 SQL 执行的相关日志 。

(二)多数据源配置类

接下来,我们需要创建 Java 配置类来配置多个数据源。这里使用@Configuration@MapperScan注解,代码示例如下:

java 复制代码
import com.alibaba.druid.pool.DruidDataSource;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;

import javax.sql.DataSource;

@Configuration
@MapperScan(basePackages = "com.example.mapper.master", sqlSessionTemplateRef = "masterSqlSessionTemplate")
public class MasterDataSourceConfig {

    @Bean(name = "masterDataSource")
    @ConfigurationProperties(prefix = "spring.datasource.dynamic.datasource.master")
    public DataSource masterDataSource() {
        return new DruidDataSource();
    }

    @Bean(name = "masterSqlSessionFactory")
    public SqlSessionFactory masterSqlSessionFactory(@Qualifier("masterDataSource") DataSource dataSource) throws Exception {
        SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
        bean.setDataSource(dataSource);
        bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/master/*.xml"));
        return bean.getObject();
    }

    @Bean(name = "masterSqlSessionTemplate")
    public SqlSessionTemplate masterSqlSessionTemplate(@Qualifier("masterSqlSessionFactory") SqlSessionFactory sqlSessionFactory) {
        return new SqlSessionTemplate(sqlSessionFactory);
    }
}
java 复制代码
import com.alibaba.druid.pool.DruidDataSource;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;

import javax.sql.DataSource;

@Configuration
@MapperScan(basePackages = "com.example.mapper.slave", sqlSessionTemplateRef = "slaveSqlSessionTemplate")
public class SlaveDataSourceConfig {

    @Bean(name = "slaveDataSource")
    @ConfigurationProperties(prefix = "spring.datasource.dynamic.datasource.slave")
    public DataSource slaveDataSource() {
        return new DruidDataSource();
    }

    @Bean(name = "slaveSqlSessionFactory")
    public SqlSessionFactory slaveSqlSessionFactory(@Qualifier("slaveDataSource") DataSource dataSource) throws Exception {
        SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
        bean.setDataSource(dataSource);
        bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/slave/*.xml"));
        return bean.getObject();
    }

    @Bean(name = "slaveSqlSessionTemplate")
    public SqlSessionTemplate slaveSqlSessionTemplate(@Qualifier("slaveSqlSessionFactory") SqlSessionFactory sqlSessionFactory) {
        return new SqlSessionTemplate(sqlSessionFactory);
    }
}

MasterDataSourceConfig配置类中,@Configuration注解表明这是一个配置类,就像一个存放各种配置规则的文件柜 。@MapperScan注解指定了该数据源对应的 Mapper 接口所在的包路径为com.example.mapper.master,并通过sqlSessionTemplateRef指定了对应的SqlSessionTemplatemasterSqlSessionTemplate,这样 Spring 在扫描 Mapper 接口时,就能准确地将其与主数据源关联起来 。

masterDataSource方法通过@Bean注解将创建的DruidDataSource注册为 Spring 容器中的一个 Bean,@ConfigurationProperties(prefix = "spring.datasource.dynamic.datasource.master")则从配置文件中读取以spring.datasource.dynamic.datasource.master为前缀的属性,来配置数据源的各项参数 。

masterSqlSessionFactory方法创建了SqlSessionFactory,它是 MyBatis 中用于创建SqlSession的工厂,@Qualifier("masterDataSource")用于指定该SqlSessionFactory使用的数据源为masterDataSource,并通过bean.setMapperLocations方法指定了 Mapper XML 文件的位置 。

masterSqlSessionTemplate方法创建了SqlSessionTemplate,它是 MyBatis 提供的用于执行 SQL 语句的模板类,同样通过@Qualifier("masterSqlSessionFactory")指定了使用的SqlSessionFactory

SlaveDataSourceConfig配置类的作用与MasterDataSourceConfig类似,只不过它是针对从数据源的配置,负责将从数据源相关的 Bean 注册到 Spring 容器中,并建立起从数据源与 Mapper 接口、SqlSessionFactorySqlSessionTemplate之间的关联 。

七、Druid 监控页面配置

(一)开启监控页面

Druid 提供了一个强大的监控页面,能实时展示数据库连接池的运行状态、SQL 执行情况等关键信息 。要开启这个监控页面,我们需要在application.yml配置文件中添加相关配置,代码如下:

yaml 复制代码
spring:
  datasource:
    druid:
      stat-view-servlet:
        enabled: true
        url-pattern: /druid/*
        login-username: admin
        login-password: 123456
        allow: 127.0.0.1
        reset-enable: false
      web-stat-filter:
        enabled: true
        url-pattern: /*
        exclusions: "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*"

在这段配置中,spring.datasource.druid.stat-view-servlet.enabled设置为true,表示启用 Druid 的监控页面 。url-pattern指定了监控页面的访问路径为/druid/*,就像给监控页面设置了一个专属的门牌号 。login-usernamelogin-password分别设置了登录监控页面的用户名和密码,这里设置为admin123456,实际使用中记得改成强密码哦 。allow配置了允许访问监控页面的 IP 地址,这里只允许本地127.0.0.1访问,保证监控页面的安全性 。reset-enable设置为false,表示禁用页面上的重置按钮,防止误操作 。

spring.datasource.druid.web-stat-filter.enabled设置为true,启用 Web 统计过滤器,它能收集 Web 应用程序的 SQL 慢查询日志等信息 。url-pattern设置为/*,表示对所有请求进行过滤 。exclusions配置了需要排除的资源路径,像静态资源(.js.gif.jpg.png.css.ico)和监控页面自身的路径(/druid/*)都不会被过滤,避免影响页面的正常加载和功能使用 。

(二)访问监控页面

完成上述配置后,启动 Spring Boot 项目。当项目启动成功后,打开浏览器,在地址栏中输入http://localhost:8080/druid/(假设项目的端口是 8080),按下回车键,就会弹出一个登录框 。

在登录框中输入我们在配置文件中设置的用户名admin和密码123456,点击登录,就能进入 Druid 的监控页面啦 。

进入监控页面后,首先映入眼帘的是 "数据源" 页面,这里展示了我们配置的多个数据源的详细信息,比如当前活跃连接数、最大连接数、已使用连接数等,就像一个数据源状态的实时仪表盘,让我们对数据源的运行情况一目了然 。通过这个页面,我们可以直观地看到主数据源和从数据源的连接池是否正常工作,是否存在连接泄漏等问题 。

切换到 "SQL 监控" 页面,这里记录了所有执行过的 SQL 语句,包括 SQL 语句的内容、执行时间、执行次数等信息 。这对于我们优化 SQL 语句,提高数据库查询性能非常有帮助 。比如,如果发现某个 SQL 语句的执行时间很长,我们就可以针对性地对其进行优化,添加索引、调整查询逻辑等 。

另外,"URI 监控" 页面展示了每个 URI 的访问次数、平均执行时间等信息,帮助我们了解应用程序中各个接口的性能表现,快速定位性能瓶颈,对接口进行优化,提升用户体验 。

八、控制台 SQL 日志配置

(一)配置日志输出级别

要在控制台输出 SQL 日志,我们需要配置 Druid 的日志输出级别。在application.yml配置文件中添加如下配置:

yaml 复制代码
logging:
  level:
    druid.sql.Statement: DEBUG
    druid.sql.Connection: DEBUG
    druid.sql.ResultSet: DEBUG

这段配置将druid.sql.Statementdruid.sql.Connectiondruid.sql.ResultSet的日志级别都设置为DEBUG 。其中,druid.sql.Statement用于控制 SQL 语句执行相关日志的输出,比如 SQL 语句的内容、执行时间等;druid.sql.Connection负责记录数据库连接的创建、获取、归还等操作的日志;druid.sql.ResultSet则用于输出结果集相关的日志,比如结果集的获取、遍历等 。通过将这些日志级别设置为DEBUG,我们就能在控制台看到详细的 SQL 执行过程和相关信息,方便调试和排查问题 。

如果你使用的是logback-spring.xml配置文件,也可以进行类似的配置,代码如下:

xml 复制代码
<configuration>
    <logger name="druid.sql.Statement" level="DEBUG" additivity="false">
        <appender-ref ref="CONSOLE" />
    </logger>
    <logger name="druid.sql.Connection" level="DEBUG" additivity="false">
        <appender-ref ref="CONSOLE" />
    </logger>
    <logger name="druid.sql.ResultSet" level="DEBUG" additivity="false">
        <appender-ref ref="CONSOLE" />
    </logger>
</configuration>

这里通过<logger>标签分别配置了三个日志记录器的级别为DEBUG,并通过<appender-ref>标签将日志输出到名为CONSOLE的控制台输出器,实现了对 SQL 日志的精细控制 。

(二)查看 SQL 日志

完成上述配置后,当项目运行并执行数据库操作时,我们就能在控制台看到详细的 SQL 日志。例如,执行一条查询用户信息的 SQL 语句,控制台输出的日志可能如下:

log 复制代码
2024-12-26 14:30:15.678 [http-nio-8080-exec-1] DEBUG druid.sql.Connection - {conn-10001} opened
2024-12-26 14:30:15.682 [http-nio-8080-exec-1] DEBUG druid.sql.Statement - {conn-10001, pstmt-20001} executeQuery: SELECT * FROM user WHERE id =? AND name =?
2024-12-26 14:30:15.682 [http-nio-8080-exec-1] DEBUG druid.sql.Statement - {conn-10001, pstmt-20001} parameters: [1, "张三"]
2024-12-26 14:30:15.705 [http-nio-8080-exec-1] DEBUG druid.sql.Statement - {conn-10001, pstmt-20001} executed. 23ms
2024-12-26 14:30:15.706 [http-nio-8080-exec-1] DEBUG druid.sql.ResultSet - {conn-10001, pstmt-20001, rs-30001} open
2024-12-26 14:30:15.707 [http-nio-8080-exec-1] DEBUG druid.sql.ResultSet - {conn-10001, pstmt-20001, rs-30001} first
2024-12-26 14:30:15.708 [http-nio-8080-exec-1] DEBUG druid.sql.ResultSet - {conn-10001, pstmt-20001, rs-30001} close
2024-12-26 14:30:15.709 [http-nio-8080-exec-1] DEBUG druid.sql.Connection - {conn-10001} closed

从这些日志中,我们可以清晰地看到数据库连接的打开和关闭时间(2024-12-26 14:30:15.6782024-12-26 14:30:15.709),执行的 SQL 语句(SELECT * FROM user WHERE id =? AND name =?)以及对应的参数值([1, "张三"]) 。还能知道 SQL 语句的执行耗时为 23ms(2024-12-26 14:30:15.6822024-12-26 14:30:15.705),结果集的打开、遍历和关闭操作也都有详细记录 。这些信息对于我们分析 SQL 执行效率、排查数据库操作问题非常有帮助 。比如,如果发现某个 SQL 语句执行时间过长,就可以根据日志中的信息进一步分析是查询逻辑复杂,还是数据库索引缺失等原因导致的,从而有针对性地进行优化 。

九、常见问题与解决方案

在配置 Spring Boot 3 + 多数据源 + Druid 的过程中,可能会遇到一些问题,下面为大家列举一些常见问题及解决方案 。

(一)依赖冲突

问题描述:项目启动时出现依赖冲突的错误信息,比如ClassNotFoundException或者NoSuchBeanDefinitionException等,可能是因为不同依赖之间的版本不兼容,例如dynamic-datasourceDruid版本冲突 。

解决方案:仔细检查pom.xml文件中的依赖版本,确保各个依赖之间相互兼容。可以参考相关框架的官方文档,获取推荐的版本组合 。如果还是无法确定问题,可以尝试使用mvn dependency:tree命令查看依赖树,找出冲突的依赖,并进行排除或版本调整 。比如,如果发现dynamic-datasourceDruid版本冲突,可以根据dynamic-datasource的官方文档,选择与之兼容的Druid版本,然后在pom.xml文件中更新Druid的版本号 。

(二)配置不生效

问题描述:在配置文件中添加了多数据源或 Druid 监控页面的配置,但启动项目后发现配置没有生效,比如监控页面无法访问,或者数据源配置没有按照预期工作 。

解决方案:首先,检查配置文件的格式是否正确,特别是application.yml文件中的缩进,YAML 文件对缩进要求非常严格,缩进错误可能导致配置解析失败 。其次,确认是否正确加载了配置文件,可以在启动类中添加@PropertySource注解,显式指定配置文件的位置 。另外,如果使用了多个配置文件,要注意配置文件的加载顺序,确保主配置文件中的配置能够覆盖其他配置文件中的默认值 。对于 Druid 监控页面无法访问的问题,还需要检查防火墙设置,确保端口没有被阻塞 。

(三)控制台 SQL 日志不打印

问题描述:按照配置步骤设置了控制台 SQL 日志输出级别,但在项目运行时,控制台没有打印 SQL 日志 。

解决方案:检查日志配置是否正确,确保application.ymllogback-spring.xml文件中关于 Druid SQL 日志的配置生效 。可以尝试将日志级别设置为TRACE,进一步查看是否有更详细的日志输出 。另外,确认项目中是否存在其他日志配置覆盖了 Druid 的日志配置,如果有,需要调整日志配置的优先级,确保 Druid 的日志配置能够生效 。同时,检查项目中是否有异常导致日志输出被中断,如果是,需要排查并解决异常问题 。

十、总结与展望

在本次技术探索中,我们成功搭建了 Spring Boot 3 + 多数据源 + Druid 的技术架构 。从搭建 Spring Boot 3 项目开始,我们逐步添加依赖,精心配置多数据源和 Druid 连接池 。通过配置文件和 Java 配置类的结合,实现了多数据源的动态切换和高效管理 。Druid 监控页面的配置,让我们能够实时监控数据库连接池的运行状态和 SQL 执行情况,为系统的性能优化提供了有力支持 。而控制台 SQL 日志的配置,更是为开发调试提供了极大的便利,帮助我们快速定位和解决问题 。

希望大家能将这套技术应用到实际项目中,充分发挥其优势,提升项目的性能和稳定性 。同时,技术是不断发展的,未来我们可以进一步探索如何优化数据源的配置,提高系统的并发处理能力;也可以研究如何结合其他技术,如缓存、分布式事务等,构建更加完善的系统架构 。期待大家在实践中不断探索,共同进步!

相关推荐
自珍JAVA24 分钟前
Gobrs-Async 框架
后端
xdscode29 分钟前
Spring 依赖注入方式全景解析
java·后端·spring
青柠代码录37 分钟前
【Spring】@Component VS @Configuration
后端
喵个咪1 小时前
go-wind-cms 微服务架构设计:为什么基于 Kratos?
后端·微服务·cms
神奇小汤圆1 小时前
百度面试官:Redis 内存满了怎么办?你有想过吗?
后端
喵个咪2 小时前
Headless 架构优势:内容与展示解耦,一套 API 打通全端生态
前端·后端·cms
开心就好20252 小时前
HTTPS超文本传输安全协议全面解析与工作原理
后端·ios
小江的记录本2 小时前
【JEECG Boot】 JEECG Boot——数据字典管理 系统性知识体系全解析
java·前端·spring boot·后端·spring·spring cloud·mybatis
神奇小汤圆2 小时前
Spring Batch实战
后端
喵个咪2 小时前
传统 CMS 太笨重?试试 Headless 架构的 GoWind,轻量又强大
前端·后端·cms