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 日志的配置,更是为开发调试提供了极大的便利,帮助我们快速定位和解决问题 。

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

相关推荐
别看我只是一直狼2 小时前
Redis 在真实项目中的 10 个经典应用场景(Java 后端必会)
后端
唐叔在学习2 小时前
Python桌面端应用消息提醒功能开发实践
后端·python·程序员
半夜里咳嗽的狼2 小时前
Java转Go的难点四:接口和适配器
后端
开到荼蘼2 小时前
Springboot 使用restTemplate发送https请求忽略ssl证书完整方案
后端
南方的耳朵2 小时前
vm跨节点通过geneve隧道收发包过程
后端
犯困的饭团2 小时前
2_【自动化引擎Ansible Runner】私有数据目录与命令行实战
后端
南方的耳朵2 小时前
kubevirt vm的流量包skb在不同net_device中流转全流程图
后端
砍材农夫2 小时前
spring ai 集成demo
后端
颜颜颜yan_2 小时前
让数据库学会说“不“——金仓 SQL 防火墙深度解析
数据库·后端