当前位置:   article > 正文

springboot基于Dynamic多数据源的实现方案(包含动态添加数据源)_spring.datasource.dynamic.primary

spring.datasource.dynamic.primary

由于公司需要实现saas平台,保证各商家的数据隔离,需要通过商家登录的时候指定相关数据源,进入系统后只查相应的数据库,使用springboot+dynamic-datasource实现

一、配置了数据库DB1、DB2和redis如下:

  1. #数据库db1
  2. spring.datasource.dynamic.primary=db1
  3. spring.datasource.dynamic.strict=true
  4. spring.datasource.dynamic.datasource.db1.url: jdbc:mysql://192.168.0.152:3306/zyb1130?autoReconnect=true&useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull&allowMultiQueries=true&useSSL=false
  5. spring.datasource.dynamic.datasource.db1.username=root
  6. spring.datasource.dynamic.datasource.db1.password=root1234
  7. spring.datasource.dynamic.datasource.db1.driver-class-name=com.mysql.jdbc.Driver
  8. #数据库db2
  9. spring.datasource.dynamic.datasource.db2.url: jdbc:mysql://192.168.0.152:3306/zyb?autoReconnect=true&useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull&allowMultiQueries=true&useSSL=false
  10. spring.datasource.dynamic.datasource.db2.username=root
  11. spring.datasource.dynamic.datasource.db2.password=root1234
  12. spring.datasource.dynamic.datasource.db2.driver-class-name=com.mysql.jdbc.Driver
  13. #
  14. #redis配置
  15. #是否开启redis缓存 true开启 false关闭
  16. spring.redis.open=true
  17. #Redis服务器地址
  18. spring.redis.host=127.0.0.1
  19. spring.redis.password=123456
  20. #Redis服务器连接端口
  21. spring.redis.port:6379
  22. #Redis数据库索引(默认为0)
  23. spring.redis.database:0
  24. #连接池最大连接数(使用0表示没有限制)
  25. spring.redis.jedis.pool.max-active=500
  26. #连接池最大阻塞等待时间(使用0表示没有限制)
  27. spring.redis.jedis.pool.max-wait:3000
  28. #连接池中的最大空闲连接
  29. spring.redis.jedis.pool.max-idle:100
  30. #连接池中的最小空闲连接
  31. spring.redis.jedis.pool.min-idle:50
  32. #控制一个pool可分配多少个jedis实例,用来替换上面的redis.maxActive,如果是jedis 2.4以后用该属性
  33. spring.redis.jedis.pool.maxTotal:500
  34. #连接超时时间(毫秒)
  35. spring.redis.timeout:3000
  36. #在空闲时检查有效性, 默认false
  37. spring.redis.testWhileIdle:true
  38. #是否在从池中取出连接前进行检验,如果检验失败,则从池中去除连接并尝试取出另一个
  39. spring.redis.testOnBorrow:true

二、请求时通过@DS("DB1")在controller或service上指定数据源代码如下:

1、本例子是在其它方法里面通过request.getSession().setAttribute("dbname",dto.getType()),往session里面添加数据库连接池名称之后,再通过@DS注解使用,如果看到此方法的朋友,请灵活使用哦

  1. @RestController
  2. @RequestMapping("/user")
  3. #此处的参数可以直接写成DB1,我这里是获取session数据
  4. @DS(value = "#session.dbname")
  5. public class DoctorController {
  6. @Resource
  7. private DataSource dataSource;
  8. @Resource
  9. private DefaultDataSourceCreator dataSourceCreator;
  10. @Resource
  11. private DruidDataSourceCreator druidDataSourceCreator;
  12. @Resource
  13. private HikariDataSourceCreator hikariDataSourceCreator;
  14. @GetMapping("getDataSource")
  15. public String getDataSource(){
  16. DynamicRoutingDataSource drds= (DynamicRoutingDataSource) dataSource;
  17. return "动态数据源";
  18. }
  19. # 推荐此方法
  20. @PostMapping("/add")
  21. public Set<String> add(@Validated @RequestBody DataSourceDTO dto) {
  22. DataSourceProperty dataSourceProperty = new DataSourceProperty();
  23. BeanUtils.copyProperties(dto, dataSourceProperty);
  24. DynamicRoutingDataSource ds = (DynamicRoutingDataSource) dataSource;
  25. DataSource dataSource = dataSourceCreator.createDataSource(dataSourceProperty);
  26. ds.addDataSource(dto.getPoolName(), dataSource);
  27. return ds.getDataSources().keySet();
  28. }
  29. #通过DataSourceDTO上传参数后,动态添加数据源,也可以通过数据库查询到之后再添加
  30. @PostMapping("/addDruid")
  31. public String addDruid(@Validated @RequestBody DataSourceDTO dto, HttpServletRequest request) {
  32. DataSourceProperty dataSourceProperty = new DataSourceProperty();
  33. BeanUtils.copyProperties(dto, dataSourceProperty);
  34. // 3.4.0版本以下如果有此属性,需手动设置,不然会空指针。
  35. // dataSourceProperty.setLazy(true);
  36. DynamicRoutingDataSource ds = (DynamicRoutingDataSource) dataSource;
  37. #基础Druid数据源
  38. DataSource dataSource = druidDataSourceCreator.createDataSource(dataSourceProperty);
  39. #推荐此方法
  40. #DataSource dataSource = dataSourceCreator.createDataSource(dataSourceProperty)
  41. #基础HikariCP数据源
  42. #DataSource dataSource = hikariDataSourceCreator.createDataSource(dataSourceProperty);
  43. ds.addDataSource(dto.getPoolName(), dataSource);
  44. //添加数据源之后动态切换
  45. request.getSession().setAttribute("dbname",dto.getType());
  46. System.out.println("获取用户数据"+dto.getType());
  47. List<HmsDoctorBean> hmsDoctorBeanList=doctorService.getUserList("15173205615");
  48. for (HmsDoctorBean hmsDoctorBean : hmsDoctorBeanList) {
  49. JSONObject jsonObject = (JSONObject) JSONObject.toJSON(hmsDoctorBean);
  50. System.out.println(jsonObject);
  51. }
  52. // return ds.getDataSources().keySet();
  53. return "添加成功";
  54. }
  55. }
  56. @Service
  57. @DS("#session.dbname")
  58. public class DoctorServiceImpl implements IDoctorService {
  59. @Autowired
  60. HmsDoctorBeanMapper doctorBeanMapper;
  61. @Override
  62. public List<HmsDoctorBean> getDoctorList(String phone) {
  63. return doctorBeanMapper.selectByPhone(phone);
  64. }
  65. @Override
  66. public List<HmsDoctorBean> getUserList(String phone) {
  67. return doctorBeanMapper.selectByPhone(phone);
  68. }
  69. }

maven引入jar

  1. <dependency>
  2. <groupId>com.baomidou</groupId>
  3. <artifactId>dynamic-datasource-spring-boot-starter</artifactId>
  4. <version>3.5.1</version>
  5. </dependency>

动态添加数据源的请求参数/wd/db/addDruid

  1. {
  2. "poolName":"db5",
  3. "driverClassName":"com.mysql.jdbc.Driver",
  4. "url":"jdbc:mysql://192.168.0.152:3306/zyb?autoReconnect=true&useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull&allowMultiQueries=true&useSSL=false",
  5. "username":"root",
  6. "password":"root1234",
  7. "type":"db5"
  8. }
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/677955
推荐阅读
相关标签
  

闽ICP备14008679号