DynamicDataSourceHandler.java 3.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. package com.persagy.fm.mybatis.handler;
  2. import com.baomidou.dynamic.datasource.DynamicRoutingDataSource;
  3. import com.baomidou.dynamic.datasource.creator.DruidDataSourceCreator;
  4. import com.baomidou.dynamic.datasource.spring.boot.autoconfigure.DataSourceProperty;
  5. import com.baomidou.dynamic.datasource.spring.boot.autoconfigure.DynamicDataSourceProperties;
  6. import com.baomidou.dynamic.datasource.toolkit.DynamicDataSourceContextHolder;
  7. import com.persagy.fm.common.context.AppContext;
  8. import com.persagy.fm.common.helper.SpringHelper;
  9. import org.apache.commons.lang3.StringUtils;
  10. import org.springframework.beans.BeanUtils;
  11. import org.springframework.beans.factory.annotation.Autowired;
  12. import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
  13. import javax.servlet.http.HttpServletRequest;
  14. import javax.servlet.http.HttpServletResponse;
  15. import javax.sql.DataSource;
  16. import java.sql.SQLException;
  17. import java.util.Set;
  18. /**
  19. * 动态数据源拦截器
  20. * @author Charlie Yu
  21. * @date 2021-03-29
  22. */
  23. public class DynamicDataSourceHandler extends HandlerInterceptorAdapter {
  24. /** 忽略的url - swagger的文档不校验 */
  25. private static final String[] IGNORE_URL = {".html", ".js", ".css", "/swagger-resources"};
  26. @Autowired
  27. private DynamicRoutingDataSource dataSource;
  28. @Autowired
  29. private DruidDataSourceCreator dataSourceCreator;
  30. @Autowired
  31. private DynamicDataSourceProperties defaultProperty;
  32. @Override
  33. public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
  34. String requestURI = request.getRequestURI();
  35. if (StringUtils.containsAny(requestURI, IGNORE_URL)) {
  36. return true;
  37. }
  38. resetDataSource();
  39. return true;
  40. }
  41. /**
  42. * 多租户处理,数据源切换
  43. */
  44. private void resetDataSource() throws SQLException {
  45. // 是否启用多数据源
  46. boolean isDynamic = SpringHelper.getBoolean("spring.datasource.dynamic.enabled", false);
  47. if(!isDynamic) {
  48. return;
  49. }
  50. // 默认为应用名
  51. String dbNameDefault = SpringHelper.getString("spring.application.name");
  52. String newDsName = AppContext.getContext().getGroupCode() + "_" + dbNameDefault;
  53. Set<String> dsNames = dataSource.getCurrentDataSources().keySet();
  54. if(!dsNames.contains(newDsName)) {
  55. // 取默认数据源
  56. DataSourceProperty srcProperty = defaultProperty.getDatasource().get(dbNameDefault);
  57. // 设置新数据源
  58. DataSourceProperty property = new DataSourceProperty();
  59. BeanUtils.copyProperties(srcProperty, property);
  60. property.setPoolName(newDsName);
  61. property.setUrl(StringUtils.replace(property.getUrl(), dbNameDefault, newDsName));
  62. // 创建数据源
  63. DataSource currDs = dataSourceCreator.createDataSource(property);
  64. dataSource.addDataSource(newDsName, currDs);
  65. }
  66. // 设置当前数据源
  67. DynamicDataSourceContextHolder.push(newDsName);
  68. }
  69. }