对于“springboot整合多数据源配置方式的完整攻略”,我会逐步进行讲解。
1. 配置数据源
在项目中引入所需的依赖,例如:
<!-- JDBC驱动依赖,根据数据库不同而变化 -->
<dependency>
<groupId>com.mysql.jdbc</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!-- spring-jdbc依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<!-- Druid连接池依赖 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.21</version>
</dependency>
在application.yml
中添加多数据源的相关配置,例如:
spring:
datasource:
# 数据源一
db1:
url: jdbc:mysql://localhost:3306/db1?useUnicode=true&characterEncoding=utf-8&autoReconnect=true&zeroDateTimeBehavior=convertToNull&useSSL=false&serverTimezone=GMT%2B8
username: root
password: root
driver-class-name: com.mysql.jdbc.Driver
# 数据源二
db2:
url: jdbc:mysql://localhost:3306/db2?useUnicode=true&characterEncoding=utf-8&autoReconnect=true&zeroDateTimeBehavior=convertToNull&useSSL=false&serverTimezone=GMT%2B8
username: root
password: root
driver-class-name: com.mysql.jdbc.Driver
2. 配置JdbcTemplate
在@Configuration
注解的类中,创建多个JdbcTemplate
对象,并为其注入不同的数据源即可。例如:
@Configuration
public class JdbcTemplateConfig {
@Bean(name = "db1JdbcTemplate")
public JdbcTemplate db1JdbcTemplate(@Qualifier("db1DataSource") DataSource dataSource) {
return new JdbcTemplate(dataSource);
}
@Bean(name = "db2JdbcTemplate")
public JdbcTemplate db2JdbcTemplate(@Qualifier("db2DataSource") DataSource dataSource) {
return new JdbcTemplate(dataSource);
}
}
注意:@Qualifier
注解用于指定注入的数据源名称,该名称对应于上文中配置的数据源名称。
3. 配置事务
如果需要对多数据源进行事务管理,可以通过JtaTransactionManager
实现全局事务。例如:
@Configuration
@EnableTransactionManagement
public class TransactionConfig {
// 数据源一的事务管理器
@Bean(name = "db1TransactionManager")
public JtaTransactionManager db1TransactionManager(@Qualifier("db1DataSource") DataSource dataSource) {
JtaTransactionManager manager = new JtaTransactionManager();
manager.setTransactionManagerName("db1TransactionManager");
manager.setUserTransactionName("db1UserTransaction");
manager.setDataSource(dataSource);
return manager;
}
// 数据源二的事务管理器
@Bean(name = "db2TransactionManager")
public JtaTransactionManager db2TransactionManager(@Qualifier("db2DataSource") DataSource dataSource) {
JtaTransactionManager manager = new JtaTransactionManager();
manager.setTransactionManagerName("db2TransactionManager");
manager.setUserTransactionName("db2UserTransaction");
manager.setDataSource(dataSource);
return manager;
}
}
4. 示例
下面通过两个简单的示例,来判断配置是否成功。
示例一:基本的增删改查
在服务层注入多数据源对应的JdbcTemplate
对象,然后就可以进行基本的增删改查操作了。例如:
@Service
public class UserService {
@Autowired
@Qualifier("db1JdbcTemplate")
private JdbcTemplate db1JdbcTemplate;
@Autowired
@Qualifier("db2JdbcTemplate")
private JdbcTemplate db2JdbcTemplate;
// 在数据源一中插入一条用户数据
public void addUserInDb1(String username, String password) {
db1JdbcTemplate.update("insert into user(username,password) values(?,?)", username, password);
}
// 在数据源二中插入一条用户数据
public void addUserInDb2(String username, String password) {
db2JdbcTemplate.update("insert into user(username,password) values(?,?)", username, password);
}
// 从数据源一中查询所有用户数据
public List<User> getUserListFromDb1() {
return db1JdbcTemplate.query("select * from user", new BeanPropertyRowMapper<>(User.class));
}
// 从数据源二中查询所有用户数据
public List<User> getUserListFromDb2() {
return db2JdbcTemplate.query("select * from user", new BeanPropertyRowMapper<>(User.class));
}
}
示例二:事务
在服务层需要进行事务操作时,可以使用@Transactional
注解。例如:
@Service
public class UserService {
@Autowired
@Qualifier("db1JdbcTemplate")
private JdbcTemplate db1JdbcTemplate;
@Autowired
@Qualifier("db2JdbcTemplate")
private JdbcTemplate db2JdbcTemplate;
@Transactional(transactionManager = "db1TransactionManager")
public void addUserInDb1WithTransaction(String username, String password) {
db1JdbcTemplate.update("insert into user(username,password) values(?,?)", username, password);
throw new RuntimeException("故意抛出异常,测试事务。");
}
@Transactional(transactionManager = "db2TransactionManager")
public void addUserInDb2WithTransaction(String username, String password) {
db2JdbcTemplate.update("insert into user(username,password) values(?,?)", username, password);
throw new RuntimeException("故意抛出异常,测试事务。");
}
}
在使用该方法时,如果出现运行时异常,则两次插入操作都会被回滚,数据库中的数据不会发生改变。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:springboot整合多数据源配置方式 - Python技术站