一、jdbcTemplate配置多数据源
在实际开发中,因为业务的复杂情况,可能分库或者分表,也可能业务模块的划分使用不同的数据源,或者其他一些特殊要求,导致需要连接多数据源。
我们先来看看jdbcTemplate的方式如何使用多数据源。
在之前的章节jdbcTemplate示例的基础上(jdbcTemplate集成示例),我们进行调整配置多数据源。
<!--mysql连接-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<!--druid连接池-->
<!--<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.0.29</version>
</dependency>-->
<!--druid连接池调整为druid-spring-boot-starter,方便自定义覆写数据源-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.10</version>
</dependency>
<!--jdbc依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
引入依赖中,druid连接池做了轻微的调整,改为druid-spring-boot-starter,方便我们更加容易的创建数据源。
然后是application核心配置文件中,因为是多数据源,这里配置了master和slave两个数据源。
server:
port: 10900
spring:
datasource:
master:
# 新版驱动从com.mysql.jdbc.Driver变更为com.mysql.cj.jdbc.Driver
driver-class-name: com.mysql.cj.jdbc.Driver
# 数据源需要添加时间标准和指定编码格式解决乱码 You must configure either the server or JDBC driver (via the serverTimezone configuration property) to use a more specifc time zone value if you want to utilize time zone support.
url: jdbc:mysql://localhost:3306/springboot?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC
username: root
password: 1234
slave:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/springboot2?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC
username: root
password: 1234
接着配置数据源,这里创建了DataSourceConfig类,这是一个配置类。ConfigurationProperties加载配置文件,分别生成masterDataSource与slaveDataSource。
@Configuration
public class DataSourceConfig {
@Bean
@ConfigurationProperties(prefix = "spring.datasource.master")
DataSource masterDataSource(){
// DataSourceBuilder.create().build();
return DruidDataSourceBuilder.create().build();
}
@Bean
@ConfigurationProperties(prefix = "spring.datasource.slave")
DataSource slaveDataSource(){
return DruidDataSourceBuilder.create().build();
}
}
有了数据源,那怎么和jdbcTemplate进行关联呢,所以我们需要进行jdbcTemplate的配置,新建JdbcTemplateConfig类。这个配置类也很简单,主要就是使用不同的DataSource绑定不同的JdbcTemplate对象,同时还指定了不同的事务管理器。
@Configuration
public class JdbcTemplateConfig {
@Bean
JdbcTemplate masterJdbcTemplate(@Qualifier("masterDataSource")DataSource masterDataSource){
return new JdbcTemplate(masterDataSource);
}
@Bean
JdbcTemplate slaveJdbcTemplate(@Qualifier("slaveDataSource")DataSource slaveDataSource){
return new JdbcTemplate(slaveDataSource);
}
// 事务管理器
@Bean
public PlatformTransactionManager masterTransactionManager(@Qualifier("masterDataSource")DataSource masterDataSource) {
return new DataSourceTransactionManager(masterDataSource);
}
// 事务管理器
@Bean
public PlatformTransactionManager slaveTransactionManager(@Qualifier("slaveDataSource")DataSource slaveDataSource) {
return new DataSourceTransactionManager(slaveDataSource);
}
}
自此,多数据源的jdbcTemplate就已经配置好了,而使用起来,和普通的jdbcTemplate对象没有任何差别,只要我们注入想操作库相对应的jdbcTemplate对象即可。
@Autowired
@Qualifier("masterJdbcTemplate")
private JdbcTemplate jdbcTemplate;
@Resource(name="slaveJdbcTemplate")
private JdbcTemplate slaveJdbcTemplate;
/**
* 添加用户
* @param user
* @return
*/
@Override
public int add(User user) {
return jdbcTemplate.update("insert into user(username, password) value(?, ?)",
user.getUsername(), user.getPassword());
}
/**
* 添加用户
* @param user
* @return
*/
@Override
public int addSlave(User user) {
return slaveJdbcTemplate.update("insert into user(username, password) value(?, ?)",
user.getUsername(), user.getPassword());
}
注入方式上,可以有两种选择,一种是@Bean配合@Qualifier指定名称,另一种是使用@Resource,这样我们就可以通过jdbcTemplate操作不同的数据源了。
如果在启动报错,提示找不到数据源,那是因为加载默认数据源失败了,这个时候我们需要在启动类上排除默认数据源。
@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)
public class SpringbootApplication {
public static void main(String[] args) {
SpringApplication.run(SpringbootApplication.class, args);
}
}
源码地址:https://github.com/imyanger/springboot-project/tree/master/p12-springboot-muti-jdbcTemplate