## 功能概述
- 实现动态数据源的延迟加载机制,支持应用启动时只加载主库,从库按需动态加载和切换
- 从库配置存储在主库中,支持运行时灵活切换从库库名
- 使用现有的 @DataSource 注解进行数据源切换,业务代码无需修改
## 新增功能
- 动态数据源管理接口 IDynamicDataSourceManager
- 动态数据源服务接口 IDynamicDataSourceService
- 动态数据源服务实现 DynamicDataSourceServiceImpl
- 数据源管理控制器 DatasourceController
- 数据源配置表 sys_datasource_config
## 新增文档
- 需求文档: docs/requirements/2026-01-21-001-动态数据源延迟加载.md
- 设计文档: docs/design/2026-01-21-001-动态数据源延迟加载设计.md
- 决策记录: docs/decisions/2026-01-21-001-ADR-动态数据源延迟加载.md
- SQL 脚本: docs/sql/2026-01-21-001-sys_datasource_config.sql
- 提示词: docs/prompts/2026-01-21-001-动态数据源延迟加载代码生成提示词.md
- 会话记录: docs/sessions/2026-01-21-001-session.md
- 变更日志: docs/changelog/2026-01-21-001-changelog.md
- 复盘文档: docs/retros/2026-01-21-001-retro.md
- API 文档: docs/api-docs/2026-01-21-001-api.md
- 根目录变更日志: CHANGELOG.md
## 修改功能
- 扩展 DataSourceManager 类,添加动态数据源管理方法
- 扩展 SysDatasourceConfigMapper 接口,添加 selectSysDatasourceConfigByDsName 方法
- 更新项目索引和 Authentication.canvas
## 修复问题
- 修复循环依赖问题:创建 IDynamicDataSourceManager 接口解决 datai-system 和 datai-framework 互相依赖
- 修复导入错误:删除 DynamicDataSourceServiceImpl 中未使用的导入
- 修复异常处理:将 setFilters() 调用移到 try-catch 块内
## API 接口
- POST /system/datasource/loadSlave - 加载从库数据源
- POST /system/datasource/switchSlave/{dbName} - 切换从库库名
- GET /system/datasource/getSlaveConfig - 获取从库配置
- POST /system/datasource/switch/{dsName} - 切换数据源
- DELETE /system/datasource/{dsName} - 移除数据源
209 lines
4.4 KiB
Markdown
209 lines
4.4 KiB
Markdown
# SQL 文档模板
|
||
|
||
## 元数据
|
||
- 需求编号:
|
||
- 创建时间:YYYY-MM-DD
|
||
- 创建人:
|
||
- 版本:1.0.0
|
||
- 文档类型:数据库设计文档/SQL查询文档/存储过程文档/数据流程文档
|
||
|
||
## 数据库基本信息
|
||
- **数据库系统**:MySQL/PostgreSQL/Oracle/其他
|
||
- **数据库名称**:
|
||
- **版本**:
|
||
- **环境**:开发/测试/生产
|
||
|
||
## 文档概述
|
||
- **文档目标**:
|
||
- **适用范围**:
|
||
- **使用对象**:
|
||
|
||
## 数据库结构
|
||
|
||
### 数据库关系图
|
||
```
|
||
[数据库表关系的可视化表示]
|
||
```
|
||
|
||
### 表结构
|
||
|
||
#### 表 1:[表名]
|
||
- **描述**:
|
||
- **表结构**:
|
||
| 字段名 | 数据类型 | 约束 | 默认值 | 描述 |
|
||
| ------ | ------ | ---- | ------ | ---- |
|
||
| id | BIGINT | PRIMARY KEY, AUTO_INCREMENT | - | 主键 |
|
||
| name | VARCHAR(50) | NOT NULL | - | 名称 |
|
||
| create_time | DATETIME | NOT NULL | CURRENT_TIMESTAMP | 创建时间 |
|
||
| update_time | DATETIME | NOT NULL | CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP | 更新时间 |
|
||
- **索引**:
|
||
| 索引名 | 类型 | 字段 | 描述 |
|
||
| ------ | ---- | ---- | ---- |
|
||
| idx_name | INDEX | name | 名称索引 |
|
||
- **备注**:
|
||
|
||
#### 表 2:[表名]
|
||
- **描述**:
|
||
- **表结构**:
|
||
| 字段名 | 数据类型 | 约束 | 默认值 | 描述 |
|
||
| ------ | ------ | ---- | ------ | ---- |
|
||
| id | BIGINT | PRIMARY KEY, AUTO_INCREMENT | - | 主键 |
|
||
| foreign_id | BIGINT | NOT NULL, FOREIGN KEY REFERENCES table1(id) | - | 外键 |
|
||
| value | VARCHAR(100) | NOT NULL | - | 值 |
|
||
- **索引**:
|
||
| 索引名 | 类型 | 字段 | 描述 |
|
||
| ------ | ---- | ---- | ---- |
|
||
| idx_foreign_id | INDEX | foreign_id | 外键索引 |
|
||
- **备注**:
|
||
|
||
## SQL 代码
|
||
|
||
### 查询语句
|
||
|
||
#### 查询 1:[查询名称]
|
||
- **功能描述**:
|
||
- **SQL 语句**:
|
||
```sql
|
||
-- 查询1描述
|
||
SELECT t1.id, t1.name, t2.value
|
||
FROM table1 t1
|
||
JOIN table2 t2 ON t1.id = t2.foreign_id
|
||
WHERE t1.name LIKE '%%' AND t2.value IS NOT NULL
|
||
ORDER BY t1.create_time DESC;
|
||
```
|
||
- **使用场景**:
|
||
- **性能优化**:
|
||
|
||
#### 查询 2:[查询名称]
|
||
- **功能描述**:
|
||
- **SQL 语句**:
|
||
```sql
|
||
-- 查询2描述
|
||
```
|
||
- **使用场景**:
|
||
- **性能优化**:
|
||
|
||
### 存储过程
|
||
|
||
#### 存储过程 1:[存储过程名称]
|
||
- **功能描述**:
|
||
- **SQL 代码**:
|
||
```sql
|
||
-- 存储过程1描述
|
||
DELIMITER //
|
||
CREATE PROCEDURE procedure_name(IN param1 INT, OUT result INT)
|
||
BEGIN
|
||
-- 存储过程逻辑
|
||
SELECT COUNT(*) INTO result FROM table1 WHERE id > param1;
|
||
END //
|
||
DELIMITER ;
|
||
```
|
||
- **参数说明**:
|
||
| 参数名 | 类型 | 方向 | 描述 |
|
||
| ------ | ---- | ---- | ---- |
|
||
| param1 | INT | IN | 输入参数 |
|
||
| result | INT | OUT | 输出参数 |
|
||
- **调用示例**:
|
||
```sql
|
||
CALL procedure_name(100, @result);
|
||
SELECT @result;
|
||
```
|
||
|
||
### 触发器
|
||
|
||
#### 触发器 1:[触发器名称]
|
||
- **功能描述**:
|
||
- **SQL 代码**:
|
||
```sql
|
||
-- 触发器1描述
|
||
DELIMITER //
|
||
CREATE TRIGGER trigger_name
|
||
AFTER INSERT ON table1
|
||
FOR EACH ROW
|
||
BEGIN
|
||
-- 触发器逻辑
|
||
INSERT INTO table2(foreign_id, value) VALUES(NEW.id, 'default_value');
|
||
END //
|
||
DELIMITER ;
|
||
```
|
||
- **触发条件**:
|
||
- **执行逻辑**:
|
||
|
||
### 视图
|
||
|
||
#### 视图 1:[视图名称]
|
||
- **功能描述**:
|
||
- **SQL 代码**:
|
||
```sql
|
||
-- 视图1描述
|
||
CREATE VIEW view_name AS
|
||
SELECT t1.id, t1.name, t2.value
|
||
FROM table1 t1
|
||
JOIN table2 t2 ON t1.id = t2.foreign_id;
|
||
```
|
||
- **使用场景**:
|
||
|
||
## 使用示例
|
||
|
||
### 基本查询示例
|
||
```sql
|
||
-- 基本查询示例
|
||
SELECT * FROM table1 WHERE name = 'example';
|
||
```
|
||
|
||
### 复杂查询示例
|
||
```sql
|
||
-- 复杂查询示例
|
||
```
|
||
|
||
### 存储过程调用示例
|
||
```sql
|
||
-- 存储过程调用示例
|
||
```
|
||
|
||
## 优化建议
|
||
|
||
### 索引优化
|
||
- 建议1:
|
||
- 建议2:
|
||
|
||
### 查询优化
|
||
- 建议1:
|
||
- 建议2:
|
||
|
||
### 性能监控
|
||
- 监控指标:
|
||
- 监控工具:
|
||
|
||
## 维护指南
|
||
|
||
### 备份策略
|
||
- 备份频率:
|
||
- 备份方式:
|
||
- 备份存储位置:
|
||
|
||
### 恢复流程
|
||
- 恢复步骤:
|
||
- 验证方法:
|
||
|
||
### 更新流程
|
||
- 更新步骤:
|
||
- 测试方法:
|
||
- 回滚方案:
|
||
|
||
### 常见问题
|
||
| 问题 | 解决方案 |
|
||
| ---- | ------ |
|
||
| 问题1 | 解决方案1 |
|
||
| 问题2 | 解决方案2 |
|
||
|
||
## 变更历史
|
||
|
||
| 版本 | 日期 | 变更内容 | 变更人 |
|
||
| ---- | ---- | ------ | ------ |
|
||
| 1.0.0 | YYYY-MM-DD | 初始版本 | |
|
||
| 1.1.0 | YYYY-MM-DD | 添加新表 | |
|
||
|
||
## 相关文档
|
||
- [需求文档](../requirements/YYYY-MM-DD-00X-需求名.md)
|
||
- [设计文档](../design/YYYY-MM-DD-00X-设计名.md) |