Spring Boot配置多数据源
1. 简介
在实际开发中,我们经常需要在一个应用中使用多个数据源,比如同时连接多个数据库。Spring Boot提供了简单而强大的机制来配置和管理多个数据源。
本文将向刚入行的小白介绍如何在Spring Boot中配置多数据源,并提供每一步的具体代码示例。
2. 流程概览
下面的表格展示了配置多数据源的整个流程:
步骤 | 描述 |
---|---|
1 | 添加多数据源配置 |
2 | 创建数据源 |
3 | 创建JdbcTemplate |
4 | 创建实体类和Repository |
5 | 配置事务管理器 |
6 | 配置数据源切换 |
7 | 使用多数据源 |
接下来,我们将详细介绍每一步的具体操作。
3. 添加多数据源配置
首先,我们需要在application.properties
中添加多数据源的配置:
# 数据源1
spring.datasource.url=jdbc:mysql://localhost:3306/db1
spring.datasource.username=root
spring.datasource.password=passw0rd
# 数据源2
spring.datasource.db2.url=jdbc:mysql://localhost:3306/db2
spring.datasource.db2.username=root
spring.datasource.db2.password=passw0rd
这样我们就定义了两个数据源,分别对应了db1
和db2
两个数据库。
4. 创建数据源
接下来,我们需要创建数据源。
@Configuration
public class DataSourceConfig {
@Primary
@Bean(name = "dataSource")
@ConfigurationProperties(prefix = "spring.datasource")
public DataSource dataSource() {
return DataSourceBuilder.create().build();
}
@Bean(name = "db2DataSource")
@ConfigurationProperties(prefix = "spring.datasource.db2")
public DataSource db2DataSource() {
return DataSourceBuilder.create().build();
}
}
在上述代码中,dataSource()
方法创建了主数据源,db2DataSource()
方法创建了第二个数据源。注意,我们使用了@ConfigurationProperties
注解来读取application.properties
中的配置。
5. 创建JdbcTemplate
接下来,我们需要为每个数据源创建一个JdbcTemplate
实例。
@Configuration
public class JdbcTemplateConfig {
@Bean(name = "jdbcTemplate")
public JdbcTemplate jdbcTemplate(@Qualifier("dataSource") DataSource dataSource) {
return new JdbcTemplate(dataSource);
}
@Bean(name = "db2JdbcTemplate")
public JdbcTemplate db2JdbcTemplate(@Qualifier("db2DataSource") DataSource dataSource) {
return new JdbcTemplate(dataSource);
}
}
在上述代码中,我们使用@Qualifier
注解来指定每个JdbcTemplate
对应的数据源。
6. 创建实体类和Repository
现在,我们需要创建实体类和Repository来访问数据库。
@Entity
@Table(name = "user")
public class User {
// 实体类代码...
}
@Repository
public interface UserRepository extends JpaRepository<User, Long> {
// Repository代码...
}
在上述代码中,User
是一个简单的实体类,UserRepository
是一个继承自JpaRepository
的接口。
7. 配置事务管理器
在多数据源的情况下,我们需要配置多个事务管理器。
@Configuration
@EnableTransactionManagement
public class TransactionManagerConfig {
@Autowired
@Qualifier("dataSource")
private DataSource dataSource;
@Autowired
@Qualifier("db2DataSource")
private DataSource db2DataSource;
@Bean(name = "transactionManager")
public PlatformTransactionManager transactionManager() {
return new DataSourceTransactionManager(dataSource);
}
@Bean(name = "db2TransactionManager")
public PlatformTransactionManager db2TransactionManager() {
return new DataSourceTransactionManager(db2DataSource);
}
}
在上述代码中,我们使用@Qualifier
注解指定了每个事务管理器对应的数据源。
8. 配置数据源切换
为了在不同的数据源之间切换,我们需要创建一个DataSourceContextHolder
来保存当前使用的数据源。
public class DataSourceContextHolder {
private static final ThreadLocal<String> contextHolder = new ThreadLocal<>();
public static void setDataSource(String dataSource) {
contextHolder.set(dataSource);
}
public static String getDataSource() {
return contextHolder.get();
}
public static void clearDataSource() {
contextHolder.remove();
}
}
9. 使用多数据源
最后,我们可以在需要