多数据源
所谓多数据源,就是一个Java EE项目中采用了不同数据库实例中的多个库,或者同一个数据库实例中多个不同的库。一般来说,采用MyCat等分布式数据库中间件是比较好的解决方案,这样可以把数据库读写分离、分库分表、备份等操作交给中间件去做,Java代码只需要专注于业务即可。不过,这并不意味着无法使用Java代码解决类似的问题,在Spring Framework中就可以配置多数据源,Spring Boot继承其衣钵,只不过配置方式有所变化
因为一个JdbcTemplate对应一个DataSource,开发者只需要手动提供多个DataSource,再手动配置JdbcTemplate即可。
添加如下依赖:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-starter</artifactId> <version>1.1.10</version> </dependency>
这里添加的数据库连接池依赖是druid-spring-boot-starter。druid-spring-boot-starter可以帮助开发者在Spring Boot项目中轻松集成Druid数据库连接池和监控。
配置数据库连接:
spring: datasource: boot: type: com.alibaba.druid.pool.DruidDataSource url: jdbc:mysql://localhost:3306/boot?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai username: root password: 123456 boot2: type: com.alibaba.druid.pool.DruidDataSource url: jdbc:mysql://localhost:3306/boot2?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai username: root password: 123456
配置数据源:
创建DataSourceConfig配置数据源,根据application.yml中的配置生成两个数据源:
@Configuration public class DataSourceConfig { @Primary @Bean @ConfigurationProperties("spring.datasource.boot") DataSource dsOne() { return DruidDataSourceBuilder.create().build(); } @Bean @ConfigurationProperties("spring.datasource.boot2") DataSource dsTwo() { return DruidDataSourceBuilder.create().build(); } }
配置JdbcTemplate:
只要引入了spring-jdbc依赖,那么开发者没有提供JdbcTemplate实例时,Spring Boot默认会提供一个JdbcTemplate实例。现在配置多数据源时,由开发者自己提供JdbcTemplate实例
@Configuration public class JdbcTemplateConfig { @Primary @Bean JdbcTemplate jdbcTemplateOne(@Qualifier("dsOne") DataSource dataSource) { return new JdbcTemplate(dataSource); } @Bean JdbcTemplate jdbcTemplateTwo(@Qualifier("dsTwo") DataSource dataSource) { return new JdbcTemplate(dataSource); } }
创建BookController:
@RestController public class BookController { @Resource(name = "jdbcTemplateOne") JdbcTemplate jdbcTemplate; @Autowired @Qualifier("jdbcTemplateTwo") JdbcTemplate jdbcTemplateTwo; @GetMapping("/test1") public void test1() { List<Book> books1 = jdbcTemplate.query("select * from book", new BeanPropertyRowMapper<>(Book.class)); List<Book> books2 = jdbcTemplateTwo.query("select * from book", new BeanPropertyRowMapper<>(Book.class)); System.out.println("books1:" + books1); System.out.println("books2:" + books2); } }
简单起见,这里没有添加Service层,而是直接将JdbcTemplate注入到了Controller中。在Controller中注入两个不同的JdbcTemplate有两种方式:一种是使用@Resource注解,并指明name属性,即按name进行装配,此时会根据实例名查找相应的实例注入;另一种是使用@Autowired注解结合@Qualifier注解,效果等同于使用@Resource注解。
文章来源:Spring Boot+Vue全栈开发实战 5.4 多数据源