项目作者: GongDexing

项目描述 :
基于Spring Boot,多数据源动态切换
高级语言: Java
项目地址: git://github.com/GongDexing/aop-multiple-datasource.git
创建时间: 2017-08-02T13:51:08Z
项目社区:https://github.com/GongDexing/aop-multiple-datasource

开源协议:

下载


aop-multiple-datasource

在spring boot中absractRoutingDataSource类可以用来实现数据库的动态切换,而在很多业务场景也确实需要进行数据源切换

  • 数据库读写分离,查询操作在读库上,而增删改在写库上,能够极大的提高数据库并发性能
  • 业务在数据库级别的解构,微服务架构下,每个独立的服务,都有自己的数据库,然后很多时候,业务会涉及多个多个数据库

在实际项目中,我们刚好要涉及以上业务场景,在网上找了很多这方面的资料,都不太满意,因此决定自己来实现,具体效果可以运行测试

DataSourceRegisterTest.java

  1. @FixMethodOrder(MethodSorters.NAME_ASCENDING)
  2. public class DataSourceRegisterTest {
  3. @Rule
  4. public OutputCapture outputCapture = new OutputCapture();
  5. @Test
  6. public void case1_defaultTest() {
  7. String sn = "000001";
  8. String sql = "select no from tbl_admin where no=? limit 1";
  9. AopMultipleDataSourceApplication.main(new String[] {"default", sql, sn});
  10. String output = this.outputCapture.toString();
  11. assertThat(output).contains(sn);
  12. }
  13. @Test
  14. public void case2_ds1Test() {
  15. String username = "admin-test";
  16. String sql = "select username from tbl_admin where username=? limit 1";
  17. AopMultipleDataSourceApplication.main(new String[] {"ds1", sql, username});
  18. String output = this.outputCapture.toString();
  19. assertThat(output).contains(username);
  20. }
  21. @Test
  22. public void case3_ds2Test() {
  23. String realname = "gongdexing";
  24. String sql = "select realname from tbl_admin where realname=? limit 1";
  25. AopMultipleDataSourceApplication.main(new String[] {"ds2", sql, realname});
  26. String output = this.outputCapture.toString();
  27. assertThat(output).contains(realname);
  28. }
  29. }

Test.java

  1. @Service
  2. public class Test {
  3. @Autowired
  4. private JdbcTemplate jdbcTemplate;
  5. public void defaultTest(String sql, String arg) {
  6. System.out.println(jdbcTemplate.queryForObject(sql, String.class, arg));
  7. }
  8. @TargetDataSource(name = "ds1")
  9. public void ds1Test(String sql, String arg) {
  10. System.out.println(jdbcTemplate.queryForObject(sql, String.class, arg));
  11. }
  12. @TargetDataSource(name = "ds2")
  13. public void ds2Test(String sql, String arg) {
  14. System.out.println(jdbcTemplate.queryForObject(sql, String.class, arg));
  15. }
  16. }

application.yml

  1. aop:
  2. multiple:
  3. datasources:
  4. default:
  5. type: com.alibaba.druid.pool.DruidDataSource
  6. driver-class-name: com.mysql.jdbc.Driver
  7. url: jdbc:mysql://default:3306/test?useUnicode=true&characterEncoding=UTF-8
  8. username: root
  9. password: 123456
  10. ds1:
  11. type: com.alibaba.druid.pool.DruidDataSource
  12. driver-class-name: com.mysql.jdbc.Driver
  13. url: jdbc:mysql://ds1:3306/test?useUnicode=true&characterEncoding=UTF-8
  14. username: root
  15. password: 123456
  16. ds2:
  17. type: com.alibaba.druid.pool.DruidDataSource
  18. driver-class-name: com.mysql.jdbc.Driver
  19. url: jdbc:mysql://ds2:3306/test?useUnicode=true&characterEncoding=UTF-8
  20. username: root
  21. password: 123456

在application配置好数据库信息后,在需要切换数据库的方法上annotation @TargetDataSource(name = “{{dataSourceName}}”), {{dataSourceName}}便是aop.multiple.datasources的子项,需要特别的注意,一定要配置default数据源。