给主库和报表库各建一个 datasource 和一个 jdbctemplate。主库设为默认候选,报表服务通过 @qualifier 显式选择报表库,便于验证每条查询实际连到哪里。
分别配置两套连接信息
示例使用 Spring Boot 3、JDBC Starter 和 MySQL 驱动。将配置加入 application.yml,密码由运行环境提供。
app:
db:
main:
url: ${MAIN_DB_URL}
username: ${MAIN_DB_USER}
password: ${MAIN_DB_PASSWORD}
report:
url: ${REPORT_DB_URL}
username: ${REPORT_DB_USER}
password: ${REPORT_DB_PASSWORD}

两个 URL 均使用 jdbc:mysql 格式。先在测试环境用不同库名验证,报表账号可按需求限制为只读。
按名称装配数据源和 JdbcTemplate
将配置类放在可扫描包下。DataSourceProperties 负责把 url 等连接参数交给连接池构建器。
import javax.sql.DataSource;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.jdbc.core.JdbcTemplate;
@Configuration
class DatabaseConfig {
@Bean @Primary @ConfigurationProperties("app.db.main")
DataSourceProperties mainProperties() { return new DataSourceProperties(); }
@Bean @ConfigurationProperties("app.db.report")
DataSourceProperties reportProperties() { return new DataSourceProperties(); }
@Bean @Primary
DataSource mainDataSource(@Qualifier("mainProperties") DataSourceProperties props) {
return props.initializeDataSourceBuilder().build();
}
@Bean
DataSource reportDataSource(@Qualifier("reportProperties") DataSourceProperties props) {
return props.initializeDataSourceBuilder().build();
}
@Bean @Primary
JdbcTemplate mainJdbc(@Qualifier("mainDataSource") DataSource source) {
return new JdbcTemplate(source);
}
@Bean
JdbcTemplate reportJdbc(@Qualifier("reportDataSource") DataSource source) {
return new JdbcTemplate(source);
}
}
如项目已有对应 Bean,应合并现有配置,避免同名定义。
从报表服务核对当前数据库
在受控测试里调用下列方法。主库也可以用相同 SQL 单独核对。
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Service;
@Service
class ReportService {
private final JdbcTemplate jdbc;
ReportService(@Qualifier("reportJdbc") JdbcTemplate jdbc) {
this.jdbc = jdbc;
}
String databaseName() {
return jdbc.queryForObject("SELECT DATABASE()", String.class);
}
}
预期返回报表 URL 中指定的库名。示例只建立 JDBC 查询的连接选择,跨库事务需要单独设计。











