在Spring Boot中,默认是使用单一数据源进行操作,如果要想配置多数据源的话,需要作出一些配置,主要包括以下部署,以使用 JdbcTemplate
为例。
配置数据库连接信息
分别配置两个数据test01
和test02
,在application.yml
文件中的配置数据库信息:
1 | test01: |
配置数据源信息
数据源的配置,主要包括三个部分:
DataSourceProperties
数据库连接信息1
2
3
4
5
public DataSourceProperties testOneDataSourceProperties() {
return new DataSourceProperties();
}DataSource
数据源1
2
3
4
5
public DataSource testOneDataSource() {
DataSourceProperties dataSourceProperties = testOneDataSourceProperties();
return dataSourceProperties.initializeDataSourceBuilder().build();
}PlatformTransactionManager
事物的管理1
2
3
4
5
public PlatformTransactionManager testOneTxManager(DataSource testOneDataSource) {
return new DataSourceTransactionManager(testOneDataSource);
}
使用
JdbcTemplate
, 还需要为其初始化1
2
3
4
public JdbcTemplate jdbcTemplateOne() {
return new JdbcTemplate(testOneDataSource());
}
以上操作完成了第一个数据源的配置,接下来配置第二个数据源,步骤和之前一样,只是在Bean name
不一样 :
1 | /** |
移除Spring Boot
默认配置
Spring Boot
默认是会为我们加载一些配置,如果使用多数据源的情况,就需要移除一些默认加载项:
1 |
准备脚本
分别在两个数据库中建立对应的表,以MYSQL
为例:
test01
:
1 | CREATE TABLE `Person` ( |
test01
1 | CREATE TABLE `Person` ( |
编写测试 Test
分别编写插入方法:MultipleDatasourceDemoApplicationTests.java
`
1 | package com.proliu.multiple.datasource; |
测试事物
编写
Service
TestOneService.java
、TestOneServiceImpl.java
1
2
3
4
5
6package com.proliu.multiple.datasource.service;
public interface TestOneService {
void savePerson();
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24package com.proliu.multiple.datasource.service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
public class TestOneServiceImpl implements TestOneService {
private JdbcTemplate jdbcTemplateOne;
public void savePerson() {
// TODO Auto-generated method stub
this.jdbcTemplateOne.update("insert into Person(name) values(?)", "test20");
this.jdbcTemplateOne.update("insert into Person(name) values(?)", "test21");
throw new RuntimeException("This is test error");
}
}
编写单元测试
Unit test
TestOneServiceTests.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17package com.proliu.multiple.datasource.service;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
public class TestOneServiceTests {
private TestOneService testOneService;
void testSavePerson() {
this.testOneService.savePerson();;
}
}savePerson
方法会抛出异常, 启用默认事物管理,进行回滚操作。
代码
以上传代码到GitHub
, 可以通过GitHub
multiple-datasource-jdbc-demo 进行查看。