本项目已集成阿里云 AnalyticDB (ADB) 并实现多数据源数据库访问功能。支持在同一个应用中同时访问 MySQL 主数据源和 ADB 数据源。
在 application.properties 和相关环境配置文件中,需要配置两个数据源:
# 主数据源配置
spring.datasource.primary.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.primary.url=jdbc:mysql://your-mysql-host:3306/your_database
spring.datasource.primary.username=your_username
spring.datasource.primary.password=your_password
spring.datasource.primary.initialSize=5
spring.datasource.primary.maxActive=20
# ADB 数据源配置
spring.datasource.adb.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.adb.url=jdbc:mysql://your-adb-instance-address:3306/your_database?useSSL=true&serverTimezone=Asia/Shanghai
spring.datasource.adb.username=your_adb_username
spring.datasource.adb.password=your_adb_password
spring.datasource.adb.initialSize=5
spring.datasource.adb.maxActive=20
在 Service 方法或类上使用 @DataSource 注解指定数据源:
@Service
public class YourService {
@Autowired
private YourMapper yourMapper;
// 方法级别注解
@DataSource("adb")
public List<YourEntity> queryFromAdb() {
return yourMapper.selectAll();
}
// 默认使用主数据源
public List<YourEntity> queryFromPrimary() {
return yourMapper.selectAll();
}
}
在整个类上使用 @DataSource 注解,该类所有方法都使用指定数据源:
@Service
@DataSource("adb")
public class AdbService {
// 所有方法都使用 ADB 数据源
public List<YourEntity> query() {
return yourMapper.selectAll();
}
}
在需要动态切换数据源的场景下,可以手动设置:
@Service
public class YourService {
public void queryWithManualSwitch() {
try {
// 切换到 ADB 数据源
DynamicDataSourceContextHolder.setDataSource("adb");
// 执行数据库操作
List<YourEntity> result = yourMapper.selectAll();
return result;
} finally {
// 务必清除数据源标识
DynamicDataSourceContextHolder.clearDataSource();
}
}
}
系统预定义了以下数据源标识:
primary - 主数据源(MySQL),默认数据源adb - ADB 数据源项目已包含完整的示例代码,位于:
AdbExampleMapper - ADB Mapper 示例AdbExampleService - ADB Service 使用示例AdbExampleController - ADB Controller 测试接口启动应用后,可以通过以下接口测试多数据源功能:
GET /adb/example/query?tableName=test_table&limit=10
GET /adb/example/count?tableName=test_table
clearDataSource()useSSL=true动态数据源路由类,继承自 AbstractRoutingDataSource,根据上下文决定使用哪个数据源。
数据源上下文持有者,使用 ThreadLocal 保存当前线程的数据源标识。
AOP 切面,自动拦截 @DataSource 注解并切换数据源。
数据源配置类,定义主数据源、ADB 数据源和动态数据源 Bean。
如需添加更多数据源,按以下步骤操作:
DataSourceConfig 中创建新的 DataSource BeanDynamicDataSource 的 targetDataSources 中添加新数据源DynamicDataSourceContextHolder 中添加新的数据源常量@DataSource("新数据源名称") 注解切换@DataSource 注解使用正确