如何在Spring框架中配置数据库连接池处理主从分离?
时间: 2024-11-09 18:24:56 浏览: 38
在Spring框架中配置数据库连接池处理主从分离,通常会用到第三方的数据库连接池组件,比如HikariCP、Druid 或 C3P0,以及Spring Boot的@ConfigurationProperties。以下是基本步骤:
1. 添加依赖:
首先,在项目的pom.xml或build.gradle文件中添加对应数据库连接池的依赖,比如HikariCP:
```xml
<dependency>
<groupId>com.zaxxer</groupId>
<artifactId>HikariCP</artifactId>
</dependency>
```
2. 创建数据库连接工厂(DataSource):
在Spring配置文件(application.properties或application.yml)中定义数据库的基本属性,包括主库和从库的URL、用户名、密码等,并区分它们(例如通过不同的环境变量或配置前缀):
```yaml
# application.properties or .yml
spring.datasource.master.url=jdbc:mysql://master-host:port/master-db
spring.datasource.master.username=master-user
spring.datasource.master.password=master-password
spring.datasource.slave.url=jdbc:mysql://slave-host:port/slave-db
spring.datasource.slave.username=slave-user
spring.datasource.slave.password=slave-password
```
3. 配置数据源切换策略:
在Spring配置类中,创建一个`@Configuration`的类,使用`@Primary`注解标识主数据源,然后通过`@Profile("production")`或条件注解来区分生产环境下的读写:
```java
@Configuration
@EnableTransactionManagement
public class DataSourceConfig {
@Profile("production")
@Bean(name = "primaryDataSource")
@Primary
public DataSource primaryDataSource() {
HikariConfig config = new HikariConfig();
// 设置主库配置
config.setJdbcUrl(...);
config.setUsername(...);
config.setPassword(...);
return new HikariDataSource(config);
}
@Profile("read-only")
@Bean
public DataSource slaveDataSource() {
HikariConfig config = ...;
// 设置从库配置
config.setJdbcUrl(...);
config.setUsername(...);
config.setPassword(...);
return new HikariDataSource(config);
}
}
```
4. 数据源切换:
在需要读写分离的地方,你可以使用`@Transactional`注解来自动选择数据源。如果事务中包含写操作,Spring将默认使用配置的第一个数据源(通常是主库)。如果事务仅为读操作,可以通过`PlatformTransactionManager`设置默认的数据源。
```java
@Autowired
private PlatformTransactionManager transactionManager;
@Transactional(readOnly = true)
public void readOperation() {
DataSource ds = (DataSource) transactionManager.getResource(transactionManager.getTransaction().getConnection());
// 这里使用的是从库连接
}
```
阅读全文