在企业级应用开发中,单一数据源往往难以满足复杂业务需求。例如部分核心业务数据存储于PostgreSQL,而历史归档数据则存放在SQL Server,这时就需要Spring Boot项目同时连接多种异构数据库。本文将详细介绍如何在Spring Boot中实现PostgreSQL与SQL Server的多数据源配置,为后续动态切换打下基础。
一、环境准备与依赖引入
首先需要确保开发环境中已安装JDK 17+、Maven 3.8+,并分别搭建好PostgreSQL和SQL Server数据库实例。在Spring Boot项目的pom.xml中添加必要依赖:
<!-- PostgreSQL驱动 -->
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<scope>runtime</scope>
</dependency>
<!-- SQL Server驱动 -->
<dependency>
<groupId>com.microsoft.sqlserver</groupId>
<artifactId>mssql-jdbc</artifactId>
<scope>runtime</scope>
</dependency>
<!-- MyBatis Plus依赖(可选,简化数据库操作) -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.3.1</version>
</dependency>
这些依赖将为项目提供数据库连接能力和ORM框架支持。
二、多数据源配置文件编写
在application.yml中配置两个数据源的连接信息,分别对应PostgreSQL和SQL Server:
spring:
datasource:
postgres:
jdbc-url: jdbc:postgresql://localhost:5432/business_db
username: postgres
password: 123456
driver-class-name: org.postgresql.Driver
sqlserver:
jdbc-url: jdbc:sqlserver://localhost:1433;databaseName=archive_db
username: sa
password: SqlServer@123
driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver
注意SQL Server的URL格式需要指定数据库名称,同时要确保两个数据库的服务处于运行状态,账号密码具备相应的访问权限。
三、数据源配置类实现
创建两个独立的数据源配置类,分别管理PostgreSQL和SQL Server的连接:
// PostgreSQL数据源配置
@Configuration
@MapperScan(basePackages = "com.example.mapper.postgres",
sqlSessionFactoryRef = "postgresSqlSessionFactory")
public class PostgresDataSourceConfig {
@Bean(name = "postgresDataSource")
@ConfigurationProperties(prefix = "spring.datasource.postgres")
public DataSource postgresDataSource() {
return DataSourceBuilder.create().build();
}
@Bean(name = "postgresSqlSessionFactory")
public SqlSessionFactory postgresSqlSessionFactory(
@Qualifier("postgresDataSource") DataSource dataSource) throws Exception {
SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
bean.setDataSource(dataSource);
// 设置MyBatis XML映射文件路径(可选)
bean.setMapperLocations(new PathMatchingResourcePatternResolver()
.getResources("classpath:mapper/postgres/*.xml"));
return bean.getObject();
}
@Bean(name = "postgresTransactionManager")
public DataSourceTransactionManager postgresTransactionManager(
@Qualifier("postgresDataSource") DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
}
SQL Server的配置类与上述结构基本一致,只需将前缀改为spring.datasource.sqlserver,并调整Mapper扫描路径和SQL Session Factory名称。这种配置方式通过@MapperScan注解将不同包下的Mapper接口与对应的数据源绑定,实现物理层面的数据源隔离。
四、测试验证
分别创建对应两个数据库的实体类和Mapper接口,例如PostgreSQL中的User实体和SQL Server中的ArchiveLog实体,然后在Service层注入对应的Mapper进行数据操作测试:
@Service
public class DataSyncService {
@Autowired
private UserMapper userMapper;
@Autowired
private ArchiveLogMapper archiveLogMapper;
public void syncData() {
// 从PostgreSQL查询数据
List<User> users = userMapper.selectList(null);
// 同步到SQL Server
users.forEach(user -> {
ArchiveLog log = new ArchiveLog();
log.setUserId(user.getId());
log.setArchiveTime(new Date());
archiveLogMapper.insert(log);
});
}
}
编写单元测试调用syncData方法,观察数据是否能在两个数据库之间正常流转,以此验证多数据源配置的正确性。
通过以上步骤,我们已经在Spring Boot项目中实现了PostgreSQL与SQL Server的多数据源连接。这种静态配置方式适用于数据源固定的场景,下一篇文章将介绍如何通过AOP和自定义注解实现动态数据源切换,满足更复杂的业务需求。