当前位置:   article > 正文

Spring Boot + Mybatis 整合Mysql ,SQLServer数据源以及整合druid,动态调整数据源切换。_sql server 动态数据源

sql server 动态数据源

pom.xml依赖

  1. <dependencies>
  2. <dependency>
  3. <groupId>org.springframework.boot</groupId>
  4. <artifactId>spring-boot-starter-web</artifactId>
  5. </dependency>
  6. <dependency>
  7. <groupId>org.mybatis.spring.boot</groupId>
  8. <artifactId>mybatis-spring-boot-starter</artifactId>
  9. <version>1.3.2</version>
  10. </dependency>
  11. <dependency>
  12. <groupId>mysql</groupId>
  13. <artifactId>mysql-connector-java</artifactId>
  14. <scope>runtime</scope>
  15. </dependency>
  16. <dependency>
  17. <groupId>org.springframework.boot</groupId>
  18. <artifactId>spring-boot-starter-test</artifactId>
  19. <scope>test</scope>
  20. </dependency>
  21.         <dependency>
  22.             <groupId>com.microsoft.sqlserver</groupId>
  23.             <artifactId>sqljdbc4</artifactId>
  24.             <version>4.0</version>
  25.         </dependency>
  26. <dependency>
  27. <groupId>org.springframework.boot</groupId>
  28. <artifactId>spring-boot-starter-aop</artifactId>
  29. </dependency>
  30. </dependencies>

配置文件application.yml

  1. datasource:
  2. mysql:
  3. type: com.alibaba.druid.pool.DruidDataSource
  4. driverClassName: com.mysql.jdbc.Driver
  5. url: jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&useSSL=false&characterEncoding=utf8
  6. username: root
  7. password: root
  8. initialSize: 1
  9. minIdle: 3
  10. maxActive: 20
  11. maxWait: 60000
  12. timeBetweenEvictionRunsMillis: 60000
  13. minEvictableIdleTimeMillis: 30000
  14. validationQuery: select 'x'
  15. testWhileIdle: true
  16. testOnBorrow: false
  17. testOnReturn: false
  18. poolPreparedStatements: true
  19. maxPoolPreparedStatementPerConnectionSize: 20
  20. # 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙
  21. filters: stat,wall,slf4j
  22. # 通过connectProperties属性来打开mergeSql功能;慢SQL记录
  23. connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
  24. # 合并多个DruidDataSource的监控数据
  25. #useGlobalDataSourceStat: true
  26. sqlserver:
  27. url: jdbc:sqlserver://127.0.0.1:1433;databasename=test
  28. driverClassName: com.microsoft.sqlserver.jdbc.SQLServerDriver
  29. username: lc0019999
  30. password: Xtgly2018

创建一个数据源类型枚举类

  1. public enum DataSourceType {
  2. Mysql("mysql"),
  3. SQLServer("sqlserver");
  4. private String name;
  5. DataSourceType(String name) {
  6. this.name = name;
  7. }
  8. public String getName() {
  9. return name;
  10. }
  11. public void setName(String name) {
  12. this.name = name;
  13. }
  14. }

数据上下文

  1. public class JdbcContextHolder {
  2. private final static ThreadLocal<String> local = new ThreadLocal<>();
  3. public static void putDataSource(String name){
  4. local.set(name);
  5. }
  6. public static String getDataSource(){
  7. return local.get();
  8. }
  9. }

AOP数据源切换

  1. @Aspect
  2. @Order(2)
  3. @Component
  4. public class DataSourceAspect {
  5. private Logger logger = LoggerFactory.getLogger(this.getClass());
  6. //切点
  7. @Pointcut("execution(* com.test.*.service..*(..)))")
  8. public void aspect(){
  9. System.out.println("aspect");
  10. }
  11. @Before("aspect()")
  12. private void before(JoinPoint joinPoint){
  13. Object target = joinPoint.getTarget();
  14. String method = joinPoint.getSignature().getName();
  15. Class<?> classz = target.getClass();
  16. Class<?>[] parameterTypes = ((MethodSignature) joinPoint.getSignature()).getMethod().getParameterTypes();
  17. try {
  18. Method m = classz.getMethod(method,parameterTypes);
  19. if (m != null && m.isAnnotationPresent(MyDataSource.class)){
  20. MyDataSource data = m.getAnnotation(MyDataSource.class);
  21. JdbcContextHolder.putDataSource(data.value().getName());
  22. logger.info("===============上下文赋值完成:{}"+data.value().getName());
  23. }
  24. }catch (Exception e){
  25. e.printStackTrace();
  26. }
  27. }
  28. }

自定义注解mydatasource

  1. @Retention(RetentionPolicy.RUNTIME)
  2. @Target({ElementType.METHOD})
  3. public @interface MyDataSource {
  4. DataSourceType value() default DataSourceType.Mysql;
  5. }

数据库配置

  1. @SuppressWarnings("AlibabaRemoveCommentedCode")
  2. @Configuration
  3. public class DataSourceConfig {
  4. private Logger logger = LoggerFactory.getLogger(this.getClass());
  5. @Value("${datasource.mysql.url}")
  6. private String dbUrl;
  7. @Value("${datasource.mysql.username}")
  8. private String username;
  9. @Value("${datasource.mysql.password}")
  10. private String password;
  11. @Value("${datasource.mysql.driverClassName}")
  12. private String driverClassName;
  13. @Value("${datasource.mysql.initialSize}")
  14. private int initialSize;
  15. @Value("${datasource.mysql.minIdle}")
  16. private int minIdle;
  17. @Value("${datasource.mysql.maxActive}")
  18. private int maxActive;
  19. @Value("${datasource.mysql.maxWait}")
  20. private int maxWait;
  21. @Value("${datasource.mysql.timeBetweenEvictionRunsMillis}")
  22. private int timeBetweenEvictionRunsMillis;
  23. @Value("${datasource.mysql.minEvictableIdleTimeMillis}")
  24. private int minEvictableIdleTimeMillis;
  25. @Value("${datasource.mysql.validationQuery}")
  26. private String validationQuery;
  27. @Value("${datasource.mysql.testWhileIdle}")
  28. private boolean testWhileIdle;
  29. @Value("${datasource.mysql.testOnBorrow}")
  30. private boolean testOnBorrow;
  31. @Value("${datasource.mysql.testOnReturn}")
  32. private boolean testOnReturn;
  33. @Value("${datasource.mysql.poolPreparedStatements}")
  34. private boolean poolPreparedStatements;
  35. @Value("${datasource.mysql.maxPoolPreparedStatementPerConnectionSize}")
  36. private int maxPoolPreparedStatementPerConnectionSize;
  37. @Value("${datasource.mysql.filters}")
  38. private String filters;
  39. @Value("{datasource.mysql.connectionProperties}")
  40. private String connectionProperties;
  41. @Bean(name="mysql")
  42. @ConfigurationProperties(prefix = "datasource.mysql")
  43. public DataSource dataSourceMysql(){
  44. System.out.println("主配"+dbUrl);
  45. DruidDataSource datasource = new DruidDataSource();
  46. datasource.setUrl(dbUrl);
  47. datasource.setUsername(username);
  48. datasource.setPassword(password);
  49. datasource.setDriverClassName(driverClassName);
  50. datasource.setInitialSize(initialSize);
  51. datasource.setMinIdle(minIdle);
  52. datasource.setMaxActive(maxActive);
  53. datasource.setMaxWait(maxWait);
  54. datasource.setTimeBetweenEvictionRunsMillis(timeBetweenEvictionRunsMillis);
  55. datasource.setMinEvictableIdleTimeMillis(minEvictableIdleTimeMillis);
  56. datasource.setValidationQuery(validationQuery);
  57. datasource.setTestWhileIdle(testWhileIdle);
  58. datasource.setTestOnBorrow(testOnBorrow);
  59. datasource.setTestOnReturn(testOnReturn);
  60. datasource.setPoolPreparedStatements(poolPreparedStatements);
  61. datasource.setMaxPoolPreparedStatementPerConnectionSize(maxPoolPreparedStatementPerConnectionSize);
  62. try {
  63. datasource.setFilters(filters);
  64. } catch (SQLException e) {
  65. logger.error("druid configuration initialization filter", e);
  66. }
  67. datasource.setConnectionProperties(connectionProperties);
  68. return datasource;
  69. }
  70. @Value("${datasource.sqlserver.url}")
  71. private String sqlServerUrl;
  72. @Value("${datasource.sqlserver.username}")
  73. private String sqlServerUsername;
  74. @Value("${datasource.sqlserver.password}")
  75. private String sqlServerPassword;
  76. @Value("${datasource.sqlserver.driverClassName}")
  77. private String sqlServerDriverClassName;
  78. @Bean(name="sqlserver")
  79. @ConfigurationProperties(prefix = "datasource.sqlserver")
  80. public DataSource dataSourceSQLServer(){
  81. System.out.println("次配"+sqlServerUrl);
  82. DruidDataSource datasource = new DruidDataSource();
  83. datasource.setUrl(sqlServerUrl);
  84. datasource.setUsername(sqlServerUsername);
  85. datasource.setPassword(sqlServerPassword);
  86. datasource.setDriverClassName(sqlServerDriverClassName);
  87. datasource.setInitialSize(initialSize);
  88. return datasource;
  89. }
  90. @Bean(name = "dynamicDataSource")
  91. @Primary //优先使用,多数据源
  92. public DataSource dataSource(){
  93. DynamicDataSource dynamicDataSource = new DynamicDataSource();
  94. DataSource mysql = dataSourceMysql();
  95. DataSource sqlServer = dataSourceSQLServer();
  96. //设置默认数据源
  97. dynamicDataSource.setDefaultTargetDataSource(mysql);
  98. //配置多个数据源
  99. Map<Object,Object> map = new HashMap<>();
  100. map.put(DataSourceType.Mysql.getName(),mysql);
  101. map.put(DataSourceType.SQLServer.getName(),sqlServer);
  102. dynamicDataSource.setTargetDataSources(map);
  103. return dynamicDataSource;
  104. }
  105. @Bean(name="druidServlet")
  106. public ServletRegistrationBean druidServlet() {
  107. ServletRegistrationBean reg = new ServletRegistrationBean();
  108. reg.setServlet(new StatViewServlet());
  109. reg.addUrlMappings("/druid/*");
  110. reg.addInitParameter("allow", ""); //白名单
  111. return reg;
  112. }
  113. @Bean(name = "filterRegistrationBean")
  114. public FilterRegistrationBean filterRegistrationBean() {
  115. FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();
  116. filterRegistrationBean.setFilter(new WebStatFilter());
  117. filterRegistrationBean.addUrlPatterns("/*");
  118. filterRegistrationBean.addInitParameter("exclusions", "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*");
  119. filterRegistrationBean.addInitParameter("profileEnable", "true");
  120. filterRegistrationBean.addInitParameter("principalCookieName","USER_COOKIE");
  121. filterRegistrationBean.addInitParameter("principalSessionName","USER_SESSION");
  122. filterRegistrationBean.addInitParameter("DruidWebStatFilter","/*");
  123. return filterRegistrationBean;
  124. }
  125. }



声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号