Spring多数据源配置实现方法实例分析
在Spring应用中,我们经常需要连接多个数据库进行操作,此时需要使用到多数据源配置。本文将介绍如何在Spring框架中配置多数据源,并通过一个示例演示其使用方法。
一、添加多数据源依赖
在进行多数据源配置前,需先在pom.xml文件中添加相应的依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>com.zaxxer</groupId>
<artifactId>HikariCP</artifactId>
</dependency>
二、配置数据源信息
在Spring Boot应用的配置文件application.properties中配置多个数据源的信息,如下所示:
# 数据源1配置
spring.datasource.one.url=jdbc:mysql://localhost:3306/db1?useUnicode=true&characterEncoding=utf-8
spring.datasource.one.username=root
spring.datasource.one.password=root
spring.datasource.one.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.one.type=com.zaxxer.hikari.HikariDataSource
# 数据源2配置
spring.datasource.two.url=jdbc:mysql://localhost:3306/db2?useUnicode=true&characterEncoding=utf-8
spring.datasource.two.username=root
spring.datasource.two.password=root
spring.datasource.two.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.two.type=com.zaxxer.hikari.HikariDataSource
三、配置数据源bean
在Spring Boot应用的配置类中,创建多个数据源bean并加入Spring容器中,如下所示:
@Configuration
public class MultipleDataSourceConfig {
@Bean(name = "dataSourceOne")
@Primary
@ConfigurationProperties(prefix = "spring.datasource.one")
public DataSource dataSourceOne() {
return DataSourceBuilder.create().type(HikariDataSource.class).build();
}
@Bean(name = "dataSourceTwo")
@ConfigurationProperties(prefix = "spring.datasource.two")
public DataSource dataSourceTwo() {
return DataSourceBuilder.create().type(HikariDataSource.class).build();
}
}
四、配置多数据源JdbcTemplate
创建多个JdbcTemplate bean并注入对应的数据源bean,示例代码如下:
@Configuration
public class JdbcTemplateConfig {
@Bean(name = "jdbcTemplateOne")
public JdbcTemplate jdbcTemplateOne(@Qualifier("dataSourceOne") DataSource dataSource) {
return new JdbcTemplate(dataSource);
}
@Bean(name = "jdbcTemplateTwo")
public JdbcTemplate jdbcTemplateTwo(@Qualifier("dataSourceTwo") DataSource dataSource) {
return new JdbcTemplate(dataSource);
}
}
五、使用示例
在应用中直接注入对应的JdbcTemplate bean即可使用对应的数据源进行数据操作,示例代码如下:
@Service
public class UserService {
@Autowired
@Qualifier("jdbcTemplateOne")
private JdbcTemplate jdbcTemplateOne;
@Autowired
@Qualifier("jdbcTemplateTwo")
private JdbcTemplate jdbcTemplateTwo;
public void saveUserOne(User user) {
jdbcTemplateOne.update("INSERT INTO users(name, age) VALUES(?, ?)", user.getName(), user.getAge());
}
public void saveUserTwo(User user) {
jdbcTemplateTwo.update("INSERT INTO users(name, age) VALUES(?, ?)", user.getName(), user.getAge());
}
}
以上就是Spring多数据源配置实现方法实例分析,下面提供两个使用示例:
示例一
假设我们需要在一个用户管理系统中同时连接两个数据库,并将用户信息分别存储到两个不同的数据库中,如下所示:
@RestController
public class UserController {
@Autowired
private UserService userService;
@PostMapping("/user")
public void saveUser(@RequestBody User user) {
userService.saveUserOne(user);
userService.saveUserTwo(user);
}
}
示例二
假设在一个Spring Batch应用中需要使用多个数据源,如下所示:
@Configuration
@EnableBatchProcessing
public class BatchConfig {
@Autowired
private JobBuilderFactory jobs;
@Autowired
private StepBuilderFactory steps;
@Autowired
@Qualifier("dataSourceOne")
private DataSource dataSourceOne;
@Autowired
@Qualifier("dataSourceTwo")
private DataSource dataSourceTwo;
@Bean
public JdbcCursorItemReader<Record> readerOne() {
JdbcCursorItemReader<Record> reader = new JdbcCursorItemReader<>();
reader.setDataSource(dataSourceOne);
reader.setSql("SELECT * FROM records WHERE status = 'NEW'");
reader.setRowMapper(new RecordMapper());
return reader;
}
@Bean
public JdbcCursorItemReader<Record> readerTwo() {
JdbcCursorItemReader<Record> reader = new JdbcCursorItemReader<>();
reader.setDataSource(dataSourceTwo);
reader.setSql("SELECT * FROM records WHERE status = 'NEW'");
reader.setRowMapper(new RecordMapper());
return reader;
}
@Bean
public ItemWriter<Record> writerOne() {
return records -> {
for (Record record : records) {
jdbcTemplateOne.update("UPDATE records SET status = 'PROCESSED' WHERE id = ?", record.getId());
}
};
}
@Bean
public ItemWriter<Record> writerTwo() {
return records -> {
for (Record record : records) {
jdbcTemplateTwo.update("UPDATE records SET status = 'PROCESSED' WHERE id = ?", record.getId());
}
};
}
@Bean
public Step stepOne() {
return steps.get("stepOne")
.<Record, Record>chunk(100)
.reader(readerOne())
.writer(writerOne())
.build();
}
@Bean
public Step stepTwo() {
return steps.get("stepTwo")
.<Record, Record>chunk(100)
.reader(readerTwo())
.writer(writerTwo())
.build();
}
@Bean
public Job job() {
return jobs.get("job")
.start(stepOne())
.next(stepTwo())
.build();
}
}
以上两个示例分别演示了在普通应用和Spring Batch应用中使用多数据源进行数据操作的方式。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:spring多数据源配置实现方法实例分析 - Python技术站