当前位置:   article > 正文

SpingBoot使用Mybatis-Plus操作多数据源,同时操作sqlserver和mysql_mybatis plus sqlserver

mybatis plus sqlserver

目录

需求场景

需求逻辑:

难点:

说明:

代码

pom.xml依赖只贴sqlserver的

文件目录

yml配置文件 

DataSource自定义注解

DataSourceAspect类文件

DruidConfig类

DruidProperties类

DynamicDataSource

DynamicDataSourceContextHolder

spring工具类

DataSourceType 

如何使用

 遇到的报错

问题一

问题二

问题三

问题四

 总结


需求场景

在学校或者自己练习的demo,基本都是配置一个数据源即可,基本都是使用MySQL,可是在工作中经常会出现很多不一样的场景和需求。

这里说一下我的需求:我需要从mysql数据库中通过一个字段去sqlserver数据库中读取数据,然后封装数据再录入到mysql中库中对应的表

需求逻辑:

  1. 首先需要查mysql的表,从表中获取字段
  2. 其次要用这个字段去sqlserver中查询我们想要的数据
  3. 最后解析数据封装,录入到mysql的另一个表中

难点:

  1. 如何配置多数据源
  2. 配置了多数据源如何动态的去查询数据

说明:

    尝试了很多方法,发现都不行,各种报错,在文章的后面会把我部署过程中的报错全部展现一下,方便大家排错,最后用的若依框架中的aop动态切换数据源的方式

后台手册 | RuoYi使用若依快速构建web应用程序http://doc.ruoyi.vip/ruoyi/document/htsc.html#%E5%A4%9A%E6%95%B0%E6%8D%AE%E6%BA%90

代码

pom.xml依赖只贴sqlserver的

  1. <!-- SQL Server -->
  2. <dependency>
  3. <groupId>com.microsoft.sqlserver</groupId>
  4. <artifactId>mssql-jdbc</artifactId>
  5. <version>9.2.1.jre15</version>
  6. </dependency>

文件目录

yml配置文件 

这里的数据源分为master 和 slave  如果你有三个四个五个数据源在这里都可以配置,只要在后面的config类配置中进行配置即可 

  1. #dev环境 mysql 7.0
  2. spring:
  3. application:
  4. name: data-spider
  5. datasource:
  6. type: com.alibaba.druid.pool.DruidDataSource
  7. # 配置多数据源
  8. master:
  9. Url: jdbc:mysql://localhost:3306/库名?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8&useSSL=false
  10. username: root
  11. password: root
  12. #driver-class-name: com.mysql.cj.jdbc.Driver
  13. slave:
  14. enabled: true
  15. Url: jdbc:sqlserver://localhost:1433;DatabaseName=test
  16. username: sa
  17. password: 123456
  18. driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver
  19. druid:
  20. inital-size: 10
  21. #最大连接数
  22. max-active: 50
  23. #最小连接数
  24. min-idle: 10
  25. #获取链接等待超时时间
  26. max-wait: 5000
  27. pool-prepared-statements: true #是否缓存preparedStatement,也就是PSCache。PSCache对支持游标的数据库性能提升巨大,比如说oracle。在mysql下建议关闭。
  28. max-pool-prepared-statement-per-connection-size: 20
  29. validation-query: SELECT 1
  30. validation-query-timeout: 20000
  31. test-on-borrow: false #申请连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能。
  32. test-on-return: false #归还连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能。
  33. test-while-idle: true #建议配置为true,不影响性能,并且保证安全性。申请连接的时候检测,如果空闲时间大于timeBetweenEvictionRunsMillis,执行validationQuery检测连接是否有效。
  34. time-between-eviction-runs-millis: 60000 #配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
  35. min-evictable-idle-time-millis: 300000 #一个连接在池中最小生存的时间,单位是毫秒
  36. max-evictable-idle-time-millis: 900000 # 配置一个连接在池中最大生存的时间,单位是毫秒
  37. #StatViewServlet配置。(因为暴露的监控信息比较敏感,支持密码加密和访问ip限定)
  38. web-stat-filter:
  39. enableed: true
  40. stat-view-servlet:
  41. enabled: true
  42. url-pattern: /druid/*
  43. #可以增加访问账号密码【去掉注释就可以】
  44. #login-username: admin
  45. #login-password: admin
  46. filter:
  47. stat:
  48. enabled: true
  49. # 慢SQL 记录
  50. log-slow-sql: true
  51. slow-sql-millis: 1000
  52. merge-sql: true
  53. wall:
  54. config:
  55. multi-statement-allow: true

DataSource自定义注解

通过注解的方式动态切换数据源,很灵活

  1. package com.hhubrain.common.annotation;
  2. import com.hhubrain.model.enums.DataSourceType;
  3. import java.lang.annotation.Documented;
  4. import java.lang.annotation.ElementType;
  5. import java.lang.annotation.Inherited;
  6. import java.lang.annotation.Retention;
  7. import java.lang.annotation.RetentionPolicy;
  8. import java.lang.annotation.Target;
  9. /**
  10. * 自定义多数据源切换注解
  11. *
  12. * 优先级:先方法,后类,如果方法覆盖了类上的数据源类型,以方法的为准,否则以类上的为准
  13. *
  14. * @author
  15. */
  16. @Target({ ElementType.METHOD, ElementType.TYPE })
  17. @Retention(RetentionPolicy.RUNTIME)
  18. @Documented
  19. @Inherited
  20. public @interface DataSource
  21. {
  22. /**
  23. * 切换数据源名称
  24. */
  25. public DataSourceType value() default DataSourceType.MASTER;
  26. }

DataSourceAspect类文件

aop切面思想

  1. package com.hhubrain.common.aop;
  2. import java.util.Objects;
  3. import com.hhubrain.common.annotation.DataSource;
  4. import com.hhubrain.datasource.DynamicDataSourceContextHolder;
  5. import com.hhubrain.utils.StringUtils;
  6. import org.aspectj.lang.ProceedingJoinPoint;
  7. import org.aspectj.lang.annotation.Around;
  8. import org.aspectj.lang.annotation.Aspect;
  9. import org.aspectj.lang.annotation.Pointcut;
  10. import org.aspectj.lang.reflect.MethodSignature;
  11. import org.slf4j.Logger;
  12. import org.slf4j.LoggerFactory;
  13. import org.springframework.core.annotation.AnnotationUtils;
  14. import org.springframework.core.annotation.Order;
  15. import org.springframework.stereotype.Component;
  16. /**
  17. *
  18. * 多数据源处理
  19. *
  20. * @author
  21. */
  22. @Aspect
  23. @Order(1)
  24. @Component
  25. public class DataSourceAspect
  26. {
  27. protected Logger logger = LoggerFactory.getLogger(getClass());
  28. //这里的地址就是上面的DataSource注解的位置
  29. @Pointcut("@annotation(com.hhubrain.common.annotation.DataSource)"
  30. + "|| @within(com.hhubrain.common.annotation.DataSource)")
  31. public void dsPointCut()
  32. {
  33. }
  34. @Around("dsPointCut()")
  35. public Object around(ProceedingJoinPoint point) throws Throwable
  36. {
  37. DataSource dataSource = getDataSource(point);
  38. if (StringUtils.isNotNull(dataSource))
  39. {
  40. DynamicDataSourceContextHolder.setDataSourceType(dataSource.value().name());
  41. }
  42. try
  43. {
  44. return point.proceed();
  45. }
  46. finally
  47. {
  48. // 销毁数据源 在执行方法之后
  49. DynamicDataSourceContextHolder.clearDataSourceType();
  50. }
  51. }
  52. /**
  53. * 获取需要切换的数据源
  54. */
  55. public DataSource getDataSource(ProceedingJoinPoint point)
  56. {
  57. MethodSignature signature = (MethodSignature) point.getSignature();
  58. DataSource dataSource = AnnotationUtils.findAnnotation(signature.getMethod(), DataSource.class);
  59. if (Objects.nonNull(dataSource))
  60. {
  61. return dataSource;
  62. }
  63. return AnnotationUtils.findAnnotation(signature.getDeclaringType(), DataSource.class);
  64. }
  65. }

DruidConfig类

  驱动自定义配置类,去获取不同的数据源做不同的事情

  1. package com.hhubrain.common.config;
  2. import java.io.IOException;
  3. import java.util.HashMap;
  4. import java.util.Map;
  5. import javax.servlet.Filter;
  6. import javax.servlet.FilterChain;
  7. import javax.servlet.ServletException;
  8. import javax.servlet.ServletRequest;
  9. import javax.servlet.ServletResponse;
  10. import javax.sql.DataSource;
  11. import com.hhubrain.datasource.DynamicDataSource;
  12. import com.hhubrain.model.enums.DataSourceType;
  13. import com.hhubrain.utils.SpringUtils;
  14. import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
  15. import org.springframework.boot.context.properties.ConfigurationProperties;
  16. import org.springframework.boot.web.servlet.FilterRegistrationBean;
  17. import org.springframework.context.annotation.Bean;
  18. import org.springframework.context.annotation.Configuration;
  19. import org.springframework.context.annotation.Primary;
  20. import com.alibaba.druid.pool.DruidDataSource;
  21. import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceBuilder;
  22. import com.alibaba.druid.spring.boot.autoconfigure.properties.DruidStatProperties;
  23. import com.alibaba.druid.util.Utils;
  24. /**
  25. * druid 配置多数据源
  26. *
  27. * @author
  28. */
  29. @Configuration
  30. public class DruidConfig
  31. {
  32. //ConfigurationProperties 配置master数据源的前缀 看你的yml文件中的配置是否一致
  33. @Bean
  34. @ConfigurationProperties("spring.datasource.master")
  35. public DataSource masterDataSource(DruidProperties druidProperties)
  36. {
  37. DruidDataSource dataSource = DruidDataSourceBuilder.create().build();
  38. return druidProperties.dataSource(dataSource);
  39. }
  40. //ConditionalOnProperty这个注解的意思是 当配置文件中enabled这个值为true时才执行这个方法
  41. @Bean
  42. @ConfigurationProperties("spring.datasource.slave")
  43. @ConditionalOnProperty(prefix = "spring.datasource.slave", name = "enabled", havingValue = "true")
  44. public DataSource slaveDataSource(DruidProperties druidProperties)
  45. {
  46. DruidDataSource dataSource = DruidDataSourceBuilder.create().build();
  47. return druidProperties.dataSource(dataSource);
  48. }
  49. @Bean(name = "dynamicDataSource")
  50. @Primary
  51. public DynamicDataSource dataSource(DataSource masterDataSource)
  52. {
  53. Map<Object, Object> targetDataSources = new HashMap<>();
  54. targetDataSources.put(DataSourceType.MASTER.name(), masterDataSource);
  55. setDataSource(targetDataSources, DataSourceType.SLAVE.name(), "slaveDataSource");
  56. return new DynamicDataSource(masterDataSource, targetDataSources);
  57. }
  58. /**
  59. * 设置数据源
  60. *
  61. * @param targetDataSources 备选数据源集合
  62. * @param sourceName 数据源名称
  63. * @param beanName bean名称
  64. */
  65. public void setDataSource(Map<Object, Object> targetDataSources, String sourceName, String beanName)
  66. {
  67. try
  68. {
  69. DataSource dataSource = SpringUtils.getBean(beanName);
  70. targetDataSources.put(sourceName, dataSource);
  71. }
  72. catch (Exception e)
  73. {
  74. }
  75. }
  76. /**
  77. * 去除监控页面底部的广告
  78. */
  79. @SuppressWarnings({ "rawtypes", "unchecked" })
  80. @Bean
  81. @ConditionalOnProperty(name = "spring.datasource.druid.statViewServlet.enabled", havingValue = "true")
  82. public FilterRegistrationBean removeDruidFilterRegistrationBean(DruidStatProperties properties)
  83. {
  84. // 获取web监控页面的参数
  85. DruidStatProperties.StatViewServlet config = properties.getStatViewServlet();
  86. // 提取common.js的配置路径
  87. String pattern = config.getUrlPattern() != null ? config.getUrlPattern() : "/druid/*";
  88. String commonJsPattern = pattern.replaceAll("\\*", "js/common.js");
  89. final String filePath = "support/http/resources/js/common.js";
  90. // 创建filter进行过滤
  91. Filter filter = new Filter()
  92. {
  93. @Override
  94. public void init(javax.servlet.FilterConfig filterConfig) throws ServletException
  95. {
  96. }
  97. @Override
  98. public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
  99. throws IOException, ServletException
  100. {
  101. chain.doFilter(request, response);
  102. // 重置缓冲区,响应头不会被重置
  103. response.resetBuffer();
  104. // 获取common.js
  105. String text = Utils.readFromResource(filePath);
  106. // 正则替换banner, 除去底部的广告信息
  107. text = text.replaceAll("<a.*?banner\"></a><br/>", "");
  108. text = text.replaceAll("powered.*?shrek.wang</a>", "");
  109. response.getWriter().write(text);
  110. }
  111. @Override
  112. public void destroy()
  113. {
  114. }
  115. };
  116. FilterRegistrationBean registrationBean = new FilterRegistrationBean();
  117. registrationBean.setFilter(filter);
  118. registrationBean.addUrlPatterns(commonJsPattern);
  119. return registrationBean;
  120. }
  121. }

DruidProperties类

属性配置类,针对yml文件中的配置获取

  1. package com.hhubrain.common.config;
  2. import org.springframework.beans.factory.annotation.Value;
  3. import org.springframework.context.annotation.Configuration;
  4. import com.alibaba.druid.pool.DruidDataSource;
  5. /**
  6. * druid 配置属性
  7. *
  8. * @author
  9. */
  10. @Configuration
  11. public class DruidProperties
  12. {
  13. @Value("${spring.datasource.druid.inital-size}")
  14. private int initialSize;
  15. @Value("${spring.datasource.druid.min-idle}")
  16. private int minIdle;
  17. @Value("${spring.datasource.druid.max-active}")
  18. private int maxActive;
  19. @Value("${spring.datasource.druid.max-wait}")
  20. private int maxWait;
  21. @Value("${spring.datasource.druid.time-between-eviction-runs-millis}")
  22. private int timeBetweenEvictionRunsMillis;
  23. @Value("${spring.datasource.druid.min-evictable-idle-time-millis}")
  24. private int minEvictableIdleTimeMillis;
  25. @Value("${spring.datasource.druid.max-evictable-idle-time-millis}")
  26. private int maxEvictableIdleTimeMillis;
  27. @Value("${spring.datasource.druid.validation-query}")
  28. private String validationQuery;
  29. @Value("${spring.datasource.druid.test-while-idle}")
  30. private boolean testWhileIdle;
  31. @Value("${spring.datasource.druid.test-on-borrow}")
  32. private boolean testOnBorrow;
  33. @Value("${spring.datasource.druid.test-on-return}")
  34. private boolean testOnReturn;
  35. public DruidDataSource dataSource(DruidDataSource datasource)
  36. {
  37. /** 配置初始化大小、最小、最大 */
  38. datasource.setInitialSize(initialSize);
  39. datasource.setMaxActive(maxActive);
  40. datasource.setMinIdle(minIdle);
  41. /** 配置获取连接等待超时的时间 */
  42. datasource.setMaxWait(maxWait);
  43. /** 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 */
  44. datasource.setTimeBetweenEvictionRunsMillis(timeBetweenEvictionRunsMillis);
  45. /** 配置一个连接在池中最小、最大生存的时间,单位是毫秒 */
  46. datasource.setMinEvictableIdleTimeMillis(minEvictableIdleTimeMillis);
  47. datasource.setMaxEvictableIdleTimeMillis(maxEvictableIdleTimeMillis);
  48. /**
  49. * 用来检测连接是否有效的sql,要求是一个查询语句,常用select 'x'。如果validationQuery为null,testOnBorrow、testOnReturn、testWhileIdle都不会起作用。
  50. */
  51. datasource.setValidationQuery(validationQuery);
  52. /** 建议配置为true,不影响性能,并且保证安全性。申请连接的时候检测,如果空闲时间大于timeBetweenEvictionRunsMillis,执行validationQuery检测连接是否有效。 */
  53. datasource.setTestWhileIdle(testWhileIdle);
  54. /** 申请连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能。 */
  55. datasource.setTestOnBorrow(testOnBorrow);
  56. /** 归还连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能。 */
  57. datasource.setTestOnReturn(testOnReturn);
  58. return datasource;
  59. }
  60. }

DynamicDataSource

动态数据源

  1. package com.hhubrain.datasource;
  2. import java.util.Map;
  3. import javax.sql.DataSource;
  4. import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;
  5. /**
  6. * 动态数据源
  7. *
  8. * @author
  9. */
  10. public class DynamicDataSource extends AbstractRoutingDataSource
  11. {
  12. public DynamicDataSource(DataSource defaultTargetDataSource, Map<Object, Object> targetDataSources)
  13. {
  14. super.setDefaultTargetDataSource(defaultTargetDataSource);
  15. super.setTargetDataSources(targetDataSources);
  16. super.afterPropertiesSet();
  17. }
  18. @Override
  19. protected Object determineCurrentLookupKey()
  20. {
  21. return DynamicDataSourceContextHolder.getDataSourceType();
  22. }
  23. }

DynamicDataSourceContextHolder

数据源切换处理

  1. package com.hhubrain.datasource;
  2. import org.slf4j.Logger;
  3. import org.slf4j.LoggerFactory;
  4. /**
  5. * 数据源切换处理
  6. *
  7. * @author
  8. */
  9. public class DynamicDataSourceContextHolder
  10. {
  11. public static final Logger log = LoggerFactory.getLogger(DynamicDataSourceContextHolder.class);
  12. /**
  13. * 使用ThreadLocal维护变量,ThreadLocal为每个使用该变量的线程提供独立的变量副本,
  14. * 所以每一个线程都可以独立地改变自己的副本,而不会影响其它线程所对应的副本。
  15. */
  16. private static final ThreadLocal<String> CONTEXT_HOLDER = new ThreadLocal<>();
  17. /**
  18. * 设置数据源的变量
  19. */
  20. public static void setDataSourceType(String dsType)
  21. {
  22. log.info("切换到{}数据源", dsType);
  23. CONTEXT_HOLDER.set(dsType);
  24. }
  25. /**
  26. * 获得数据源的变量
  27. */
  28. public static String getDataSourceType()
  29. {
  30. return CONTEXT_HOLDER.get();
  31. }
  32. /**
  33. * 清空数据源变量
  34. */
  35. public static void clearDataSourceType()
  36. {
  37. CONTEXT_HOLDER.remove();
  38. }
  39. }

spring工具类

方便在非spring管理环境中获取bean

  1. package com.hhubrain.utils;
  2. import org.springframework.aop.framework.AopContext;
  3. import org.springframework.beans.BeansException;
  4. import org.springframework.beans.factory.NoSuchBeanDefinitionException;
  5. import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
  6. import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
  7. import org.springframework.context.ApplicationContext;
  8. import org.springframework.context.ApplicationContextAware;
  9. import org.springframework.stereotype.Component;
  10. /**
  11. * spring工具类 方便在非spring管理环境中获取bean
  12. *
  13. * @author
  14. */
  15. @Component
  16. public final class SpringUtils implements BeanFactoryPostProcessor, ApplicationContextAware
  17. {
  18. /** Spring应用上下文环境 */
  19. private static ConfigurableListableBeanFactory beanFactory;
  20. private static ApplicationContext applicationContext;
  21. @Override
  22. public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException
  23. {
  24. SpringUtils.beanFactory = beanFactory;
  25. }
  26. @Override
  27. public void setApplicationContext(ApplicationContext applicationContext) throws BeansException
  28. {
  29. SpringUtils.applicationContext = applicationContext;
  30. }
  31. /**
  32. * 获取对象
  33. *
  34. * @param name
  35. * @return Object 一个以所给名字注册的bean的实例
  36. * @throws BeansException
  37. *
  38. */
  39. @SuppressWarnings("unchecked")
  40. public static <T> T getBean(String name) throws BeansException
  41. {
  42. return (T) beanFactory.getBean(name);
  43. }
  44. /**
  45. * 获取类型为requiredType的对象
  46. *
  47. * @param clz
  48. * @return
  49. * @throws BeansException
  50. *
  51. */
  52. public static <T> T getBean(Class<T> clz) throws BeansException
  53. {
  54. T result = (T) beanFactory.getBean(clz);
  55. return result;
  56. }
  57. /**
  58. * 如果BeanFactory包含一个与所给名称匹配的bean定义,则返回true
  59. *
  60. * @param name
  61. * @return boolean
  62. */
  63. public static boolean containsBean(String name)
  64. {
  65. return beanFactory.containsBean(name);
  66. }
  67. /**
  68. * 判断以给定名字注册的bean定义是一个singleton还是一个prototype。 如果与给定名字相应的bean定义没有被找到,将会抛出一个异常(NoSuchBeanDefinitionException)
  69. *
  70. * @param name
  71. * @return boolean
  72. * @throws NoSuchBeanDefinitionException
  73. *
  74. */
  75. public static boolean isSingleton(String name) throws NoSuchBeanDefinitionException
  76. {
  77. return beanFactory.isSingleton(name);
  78. }
  79. /**
  80. * @param name
  81. * @return Class 注册对象的类型
  82. * @throws NoSuchBeanDefinitionException
  83. *
  84. */
  85. public static Class<?> getType(String name) throws NoSuchBeanDefinitionException
  86. {
  87. return beanFactory.getType(name);
  88. }
  89. /**
  90. * 如果给定的bean名字在bean定义中有别名,则返回这些别名
  91. *
  92. * @param name
  93. * @return
  94. * @throws NoSuchBeanDefinitionException
  95. *
  96. */
  97. public static String[] getAliases(String name) throws NoSuchBeanDefinitionException
  98. {
  99. return beanFactory.getAliases(name);
  100. }
  101. /**
  102. * 获取aop代理对象
  103. *
  104. * @param invoker
  105. * @return
  106. */
  107. @SuppressWarnings("unchecked")
  108. public static <T> T getAopProxy(T invoker)
  109. {
  110. return (T) AopContext.currentProxy();
  111. }
  112. /**
  113. * 获取当前的环境配置,无配置返回null
  114. *
  115. * @return 当前的环境配置
  116. */
  117. public static String[] getActiveProfiles()
  118. {
  119. return applicationContext.getEnvironment().getActiveProfiles();
  120. }
  121. /**
  122. * 获取当前的环境配置,当有多个环境配置时,只获取第一个
  123. *
  124. * @return 当前的环境配置
  125. */
  126. public static String getActiveProfile()
  127. {
  128. final String[] activeProfiles = getActiveProfiles();
  129. return StringUtils.isNotEmpty(activeProfiles) ? activeProfiles[0] : null;
  130. }
  131. }

DataSourceType 

type的枚举类,差点忘了

  1. package com.hhubrain.model.enums;
  2. /**
  3. * 数据源
  4. *
  5. * @author
  6. */
  7. public enum DataSourceType
  8. {
  9. /**
  10. * 主库
  11. */
  12. MASTER,
  13. /**
  14. * 从库
  15. */
  16. SLAVE,
  17. /**
  18. * 从库
  19. */
  20. TDENGINE
  21. }

如何使用

在对应的service层或者mapper层类上面或者方法上添加@DataSource(value=type)注解即可

我这里是在定时器里写的,就直接在mapper的接口方法上加的

sqlserver  对应yml文件中salve中的数据源

 mysql  对应yml文件中master中的数据源

 遇到的报错

问题一

Failed to configure a Datasource: 'url' attribute is not specified and no embedded datasource could be configured.

 解决方法:

把jdbcUrl 改成url  不管是什么 都改成url即可

问题二

Failed to bind properties under 'spring.datasource.slave' to javax.sql.Datasource:

 解决方法:

问题三

Cavse: org.springframework.jdbc.CannotbetJdbcConnectionException: Failed to obtain JDBcConnection; nested exception is com.microsoft,sglserverjdbcSQLServerException: 通过端口 1433 连接到主机 Localhost的TCP/IP连接失败。

 解决方法:

右键点击"计算机"-->选择"管理"-->选择sqlserver配置管理-->重启服务

 

 

问题四

Failed to obtain JDBC Connection; nested exception is com.microsoft.sqlserver.jdbc.SQLServerException: 对象名 'DUAL' 无效。

 解决方法:

造成这个原因是配置mysql的时候需要validation-query:SELECT 1 FROM DUAL

但是sqlserver没有DUAL 造成报错,改成以下即可

 总结

问题千千万,唯有花时间

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/羊村懒王/article/detail/520973
推荐阅读
相关标签
  

闽ICP备14008679号