Day 5 做了什么

今天主要完成了这些内容:

添加 JDBC 依赖
添加 MySQL 驱动
配置数据库连接参数
新增数据库配置类
新增数据库健康检查接口
新增数据库健康检查测试
修复 Spring Boot 自动创建数据源导致的启动问题

最终新增了一个接口:

GET /api/db/health

用于查看数据库连接状态。


为什么要接入 MySQL

KnowFlow Agent 不是一个只返回假数据的 Demo。

后面要实现:

知识库管理
文档上传
文档解析记录
文档分块
问答记录
工单记录
AI 处理日志

这些数据都需要保存。

比如:

用户上传一个文档后,系统要保存:

文档名称
所属知识库
文件类型
解析状态
向量化状态
分块数量
上传时间

用户问一个问题后,系统要保存:

问题内容
AI 回答
引用来源
模型名称
token 用量
创建时间

用户提交一个工单后,系统要保存:

工单标题
工单内容
工单状态
问题分类
优先级
AI 摘要
AI 回复建议

所以 MySQL 是后续业务功能落地的基础。


今天添加的 Maven 依赖

backend-spring/pom.xml 中添加了两个核心依赖。

1. spring-boot-starter-jdbc

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>

它的作用是:

让 Spring Boot 具备使用 JDBC 访问数据库的能力

JDBC 可以理解成 Java 连接数据库的一套标准方式。


2. mysql-connector-j

<dependency>
    <groupId>com.mysql</groupId>
    <artifactId>mysql-connector-j</artifactId>
    <version>8.4.0</version>
    <scope>runtime</scope>
</dependency>

它的作用是:

让 Java 程序能真正连接 MySQL

如果没有这个驱动,Spring Boot 不知道怎么和 MySQL 通信。


数据库配置

application.yml 中新增了数据库相关配置:

knowflow:
  database:
    enabled: ${MYSQL_ENABLED:false}
    type: mysql
    schema: ${MYSQL_DATABASE:knowflow}

这里最重要的是:

MYSQL_ENABLED=false

也就是说,默认不启用 MySQL。

这样做的原因是:现在还不是正式接数据库阶段,如果本地没有启动 MySQL,项目也应该能正常启动。

等后续真正需要连接数据库时,再设置:

$env:MYSQL_ENABLED="true"

这样才会创建 MySQL 数据源。


为什么默认不强制连接 MySQL

这是今天一个很重要的设计点。

如果一加 MySQL 依赖,就要求本地必须启动 MySQL,那么项目会变得很难运行。

比如我只是想测试:

GET /api/health

但因为 MySQL 没启动,整个 Spring Boot 项目直接启动失败。

这就不合理。

所以 Day 5 的做法是:

默认不启用 MySQL
需要时再手动开启

这样项目更适合分阶段开发。

当前阶段:

后端可以正常启动
健康检查接口可以正常访问
数据库健康检查接口可以返回未启用状态

后续阶段:

启动 MySQL
设置 MYSQL_ENABLED=true
后端真正连接数据库

数据库配置类 DatabaseProperties

今天新增了:

DatabaseProperties

它的作用是读取数据库相关配置。

比如:

enabled
type
schema

简单理解:

DatabaseProperties = 专门保存数据库配置的 Java 类

这样代码里不用到处直接读取配置,而是统一通过这个类管理。


手动数据源配置 JdbcConfig

今天还新增了:

JdbcConfig

它的作用是:

只有 MYSQL_ENABLED=true 时,才创建 MySQL 数据源

这里用到了一个关键注解:

@ConditionalOnProperty(name = "knowflow.database.enabled", havingValue = "true")

它的意思是:

只有当 knowflow.database.enabled=true 时,这个配置才生效

这就是为什么默认情况下没有 MySQL,项目也不会启动失败。


数据库健康检查接口

Day 5 新增了接口:

GET /api/db/health

它用于查看数据库连接状态。

在默认未启用 MySQL 时,返回类似:

{
  "code": 0,
  "message": "ok",
  "data": {
    "enabled": false,
    "type": "mysql",
    "schema": "knowflow",
    "status": "DISABLED"
  }
}

这个结果说明:

数据库配置存在
但当前没有启用 MySQL 连接

以后如果启用 MySQL,并且连接成功,状态就可以变成:

UP

如果连接失败,则可以返回:

DOWN

今天踩到的 Spring Boot 坑

今天遇到了一个很真实的问题。

添加了 JDBC 依赖后,运行测试时项目启动失败,报错大概意思是:

Failed to configure a DataSource
Failed to determine a suitable driver class

原因是:

Spring Boot 发现项目里有 JDBC 依赖后,会自动尝试创建数据源。

但我们还没有在默认配置里提供完整的数据库连接信息,所以它启动失败了。

这个问题很典型。

解决方式是:关闭默认的数据源自动配置,改成由我们自己控制什么时候创建数据源。

在启动类上加了:

@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)

意思是:

不要让 Spring Boot 自动创建 DataSource

然后我们通过自己的 JdbcConfig 控制:

只有 MYSQL_ENABLED=true 时才创建数据源

这样就解决了问题。


今天新增的代码结构

Day 5 新增了这些类:

config/DatabaseProperties.java
config/JdbcConfig.java
repository/DatabaseHealthRepository.java
service/DatabaseHealthService.java
controller/DatabaseHealthController.java

它们的职责分别是:

DatabaseProperties:读取数据库配置
JdbcConfig:决定什么时候创建 MySQL 数据源
DatabaseHealthRepository:执行 SELECT 1 检查数据库
DatabaseHealthService:封装数据库健康检查逻辑
DatabaseHealthController:提供 /api/db/health 接口

这也体现了后端常见的分层思想:

Controller 接收请求
Service 处理业务逻辑
Repository 访问数据库
Config 管理配置

测试结果

Day 5 最后运行了测试:

mvn test

测试结果:

Tests run: 3, Failures: 0, Errors: 0
BUILD SUCCESS

说明:

原来的 /api/health 没有被破坏
新的 /api/db/health 可以正常返回
项目在未启动 MySQL 时仍然可以正常运行

这点很重要,因为一个项目每次加新功能,都不能把旧功能搞坏。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐