开发者社区 问答 正文

Druid mybatis sqlserver2008 提示无法正常解析 merge using

1、Druid1.1.22+mybatis-spring-boot-starter 1.3.2+SqlServer2008 2、数据库源连接方式是自定义配置的多数据源切换 3、下图为数据源配置文件截图 image.png image.png

4、以下代码是数据源配置及防火墙,如下: /** * 依据数据配置 获取datasource 对象 * @param params Map 数据配置 * @return 返回datasource * @throws SQLException 抛出Sql 异常 */ public static DataSource getDataSource(Map<String, String> params) throws SQLException { DruidDataSource datasource = new DruidDataSource(); datasource.setUrl(params.get("url")); datasource.setUsername(params.get("username")); datasource.setPassword(params.get("password")); datasource.setDriverClassName(params.get("driverClassName")); if (params.containsKey("initialSize")) { datasource.setInitialSize(Integer.parseInt(params.get("initialSize"))); } if (params.containsKey("minIdle")) { datasource.setMinIdle(Integer.parseInt(params.get("minIdle"))); } if (params.containsKey("maxActive")) { datasource.setMaxActive(Integer.parseInt(params.get("maxActive"))); } if (params.containsKey("maxWait")){ datasource.setMaxWait(Long.parseLong(params.get("maxWait"))); } if (params.containsKey("timeBetweenEvictionRunsMillis")){ datasource.setTimeBetweenEvictionRunsMillis(Long.parseLong(params.get("timeBetweenEvictionRunsMillis"))); } if (params.containsKey("minEvictableIdleTimeMillis")){ datasource.setMinEvictableIdleTimeMillis(Long.parseLong(params.get("minEvictableIdleTimeMillis"))); } if (params.containsKey("validationQuery")){ datasource.setValidationQuery(params.get("validationQuery")); } if (params.containsKey("testWhileIdle")){ datasource.setTestWhileIdle(Boolean.parseBoolean(params.get("testWhileIdle"))); } if (params.containsKey("testOnBorrow")){ datasource.setTestOnBorrow(Boolean.parseBoolean(params.get("testOnBorrow"))); } if (params.containsKey("testOnReturn")){ datasource.setTestOnBorrow(Boolean.parseBoolean(params.get("testOnReturn"))); } if (params.containsKey("poolPreparedStatements")){ datasource.setPoolPreparedStatements(Boolean.parseBoolean(params.get("poolPreparedStatements"))); } if (params.containsKey("maxPoolPreparedStatementPerConnectionSize")){ datasource.setMaxPoolPreparedStatementPerConnectionSize( Integer.parseInt(params.get("maxPoolPreparedStatementPerConnectionSize"))); } if (params.containsKey("filters")){ datasource.setFilters(params.get("filters")); } if (params.containsKey("connectionProperties")){ datasource.setConnectionProperties(params.get("connectionProperties")); } if (params.containsKey("useGlobalDataSourceStat")){ datasource.setUseGlobalDataSourceStat(Boolean.parseBoolean((params.get("useGlobalDataSourceStat")))); } // * 如果配置的是druid.filters=stat,wall,log4j // * 则 ds.getProxyFilters() 获取到的过滤器将有3个,包括默认的wall过滤器, // * 此时即使我们添加同样一个wall过滤器, // * 由于List是可重复集,那么我们添加的wall过滤器不会生效, // * 系统还是用默认的wall过滤器, // * 所以,需要把原来的wall过滤器 去掉, // * 当然,方便点的方法是,直接配置 druid.filters=stat,log4j 就可以了 // * List proxyFilters = new ArrayList<>(); // * 获取原proxyFilters并添加自定义的 wallFilter, // * 注意不要通过new ArrayList<>()得到proxyFilters, // * 否则会导致原 proxyFilters 里面配置的 file都丢失 List proxyFilters = datasource.getProxyFilters(); // 添加自己new的WallFilter proxyFilters.add(wallFilter()); datasource.setProxyFilters(proxyFilters); return datasource; }

/**
 * 配置支持批量更新和自定义操作SQL
 * @return
 */
@Bean
public static WallFilter wallFilter(){
	WallFilter wallFilter = new WallFilter();
	wallFilter.setConfig(wallConfig());
	return wallFilter;
}

/**
 * 配置支持批量更新 和自定义函数操作
 * @return
 */
@Bean
public static WallConfig wallConfig() {
	WallConfig config = new WallConfig();

// 允许一次执行多条语句 config.setMultiStatementAllow(true); // 允许一次执行多条语句 config.setNoneBaseStatementAllow(true); //设置可以执行 merge sql config.setMergeAllow(false); return config; }

5、错误日志如下: org.springframework.jdbc.UncategorizedSQLException:

Error updating database. Cause: java.sql.SQLException: sql injection violation, syntax error: syntax error, error in :'ERGE entry_dtc_dtl t USING (

		', expect INTO, actual IDENTIFIER pos 19, line 1, column 6, token IDENTIFIER entry_dtc_dtl : MERGE entry_dtc_dtl t USING (
		SELECT '11' AS entry_code,'11-1' AS dtc_code,'11-1' AS dtc_name,'11' AS dtc_value, 
  		 	'' AS dtc_type, '' AS operator,'' AS operator_id,'N' AS is_save_redis ) s 
		ON (s.entry_code = t.entry_code AND s.dtc_code = t.dtc_code)
	WHEN MATCHED THEN UPDATE SET
		t.dtc_name = s.dtc_name,
		t.dtc_value = s.dtc_value,
		t.dtc_type = s.dtc_type,
		t.operate_date = GETDATE(),
		t.operator = s.operator,
		t.operator_id = s.operator_id,
		t.is_save_redis = s.is_save_redis
	WHEN NOT MATCHED THEN INSERT 
		(entry_code,dtc_code,dtc_name,dtc_value,dtc_type,operate_date,operator,operator_id,is_save_redis) 
		VALUES (s.entry_code,s.dtc_code,s.dtc_name,s.dtc_value,s.dtc_type,GETDATE(),s.operator,s.operator_id,s.is_save_redis);

SQL: MERGE entry_dtc_dtl t USING ( SELECT '11' AS entry_code,'11-1' AS dtc_code,'11-1' AS dtc_name,'11' AS dtc_value, '' AS dtc_type, '' AS operator,'' AS operator_id,'N' AS is_save_redis ) s ON (s.entry_code = t.entry_code AND s.dtc_code = t.dtc_code) WHEN MATCHED THEN UPDATE SET t.dtc_name = s.dtc_name, t.dtc_value = s.dtc_value, t.dtc_type = s.dtc_type, t.operate_date = GETDATE(), t.operator = s.operator, t.operator_id = s.operator_id, t.is_save_redis = s.is_save_redis WHEN NOT MATCHED THEN INSERT (entry_code,dtc_code,dtc_name,dtc_value,dtc_type,operate_date,operator,operator_id,is_save_redis) VALUES (s.entry_code,s.dtc_code,s.dtc_name,s.dtc_value,s.dtc_type,GETDATE(),s.operator,s.operator_id,s.is_save_redis);

Cause: java.sql.SQLException: sql injection violation, syntax error: syntax error, error in :'ERGE entry_dtc_dtl t USING (

		', expect INTO, actual IDENTIFIER pos 19, line 1, column 6, token IDENTIFIER entry_dtc_dtl : MERGE entry_dtc_dtl t USING (
		SELECT '11' AS entry_code,'11-1' AS dtc_code,'11-1' AS dtc_name,'11' AS dtc_value, 
  		 	'' AS dtc_type, '' AS operator,'' AS operator_id,'N' AS is_save_redis ) s 
		ON (s.entry_code = t.entry_code AND s.dtc_code = t.dtc_code)
	WHEN MATCHED THEN UPDATE SET
		t.dtc_name = s.dtc_name,
		t.dtc_value = s.dtc_value,
		t.dtc_type = s.dtc_type,
		t.operate_date = GETDATE(),
		t.operator = s.operator,
		t.operator_id = s.operator_id,
		t.is_save_redis = s.is_save_redis
	WHEN NOT MATCHED THEN INSERT 
		(entry_code,dtc_code,dtc_name,dtc_value,dtc_type,operate_date,operator,operator_id,is_save_redis) 
		VALUES (s.entry_code,s.dtc_code,s.dtc_name,s.dtc_value,s.dtc_type,GETDATE(),s.operator,s.operator_id,s.is_save_redis);

; uncategorized SQLException; SQL state [null]; error code [0]; sql injection violation, syntax error: syntax error, error in :'ERGE entry_dtc_dtl t USING ( ', expect INTO, actual IDENTIFIER pos 19, line 1, column 6, token IDENTIFIER entry_dtc_dtl : MERGE entry_dtc_dtl t USING ( SELECT '11' AS entry_code,'11-1' AS dtc_code,'11-1' AS dtc_name,'11' AS dtc_value, '' AS dtc_type, '' AS operator,'' AS operator_id,'N' AS is_save_redis ) s ON (s.entry_code = t.entry_code AND s.dtc_code = t.dtc_code) WHEN MATCHED THEN UPDATE SET t.dtc_name = s.dtc_name, t.dtc_value = s.dtc_value, t.dtc_type = s.dtc_type, t.operate_date = GETDATE(), t.operator = s.operator, t.operator_id = s.operator_id, t.is_save_redis = s.is_save_redis WHEN NOT MATCHED THEN INSERT (entry_code,dtc_code,dtc_name,dtc_value,dtc_type,operate_date,operator,operator_id,is_save_redis) VALUES (s.entry_code,s.dtc_code,s.dtc_name,s.dtc_value,s.dtc_type,GETDATE(),s.operator,s.operator_id,s.is_save_redis);; nested exception is java.sql.SQLException: sql injection violation, syntax error: syntax error, error in :'ERGE entry_dtc_dtl t USING ( ', expect INTO, actual IDENTIFIER pos 19, line 1, column 6, token IDENTIFIER entry_dtc_dtl : MERGE entry_dtc_dtl t USING ( SELECT '11' AS entry_code,'11-1' AS dtc_code,'11-1' AS dtc_name,'11' AS dtc_value, '' AS dtc_type, '' AS operator,'' AS operator_id,'N' AS is_save_redis ) s ON (s.entry_code = t.entry_code AND s.dtc_code = t.dtc_code) WHEN MATCHED THEN UPDATE SET t.dtc_name = s.dtc_name, t.dtc_value = s.dtc_value, t.dtc_type = s.dtc_type, t.operate_date = GETDATE(), t.operator = s.operator, t.operator_id = s.operator_id, t.is_save_redis = s.is_save_redis WHEN NOT MATCHED THEN INSERT (entry_code,dtc_code,dtc_name,dtc_value,dtc_type,operate_date,operator,operator_id,is_save_redis) VALUES (s.entry_code,s.dtc_code,s.dtc_name,s.dtc_value,s.dtc_type,GETDATE(),s.operator,s.operator_id,s.is_save_redis); at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:89) at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:81) at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:81) at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:73) at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:446) at com.sun.proxy.$Proxy80.update(Unknown Source) at org.mybatis.spring.SqlSessionTemplate.update(SqlSessionTemplate.java:294) at org.apache.ibatis.binding.MapperMethod.execute(MapperMethod.java:63) at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:59) at com.sun.proxy.$Proxy119.dtcDtlSaveAndUpdate(Unknown Source) at com.outer.impl.system.EntryDtcserviceImpl.dtcDtlSaveAndUpdate(EntryDtcserviceImpl.java:91) at com.outer.impl.system.EntryDtcserviceImpl$$FastClassBySpringCGLIB$$18e391e3.invoke( ) at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204) at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:746) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) at org.springframework.aop.framework.adapter.MethodBeforeAdviceInterceptor.invoke(MethodBeforeAdviceInterceptor.java:52) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:174) at org.springframework.aop.aspectj.AspectJAfterAdvice.invoke(AspectJAfterAdvice.java:47) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:174) at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:92) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:185) at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:688) at com.outer.impl.system.EntryDtcserviceImpl$$EnhancerBySpringCGLIB$$3bdc6416.dtcDtlSaveAndUpdate( ) at com.outer.controller.system.EntryDtcController.dtcDtlSaveAndUpdate(EntryDtcController.java:170) at com.outer.controller.system.EntryDtcController$$FastClassBySpringCGLIB$$326e890a.invoke( ) at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204) at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:746) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) at org.springframework.aop.aspectj.AspectJAfterThrowingAdvice.invoke(AspectJAfterThrowingAdvice.java:62) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:185) at org.apache.shiro.spring.security.interceptor.AopAllianceAnnotationsAuthorizingMethodInterceptor$1.proceed(AopAllianceAnnotationsAuthorizingMethodInterceptor.java:82) at org.apache.shiro.authz.aop.AuthorizingMethodInterceptor.invoke(AuthorizingMethodInterceptor.java:39) at org.apache.shiro.spring.security.interceptor.AopAllianceAnnotationsAuthorizingMethodInterceptor.invoke(AopAllianceAnnotationsAuthorizingMethodInterceptor.java:115) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:185) at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:92) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:185) at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:688) at com.outer.controller.system.EntryDtcController$$EnhancerBySpringCGLIB$$1b469282.dtcDtlSaveAndUpdate( ) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:209) at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:136) at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:102) at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:877) at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:783) at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:991) at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:925) at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:974) at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:877) at javax.servlet.http.HttpServlet.service(HttpServlet.java:661) at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:851) at javax.servlet.http.HttpServlet.service(HttpServlet.java:742) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:61) at org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108) at org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137) at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:125) at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66) at org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:449) at org.apache.shiro.web.servlet.AbstractShiroFilter$1.call(AbstractShiroFilter.java:365) at org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:90) at org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:83) at org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:387) at org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:362) at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:125) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at com.alibaba.druid.support.http.WebStatFilter.doFilter(WebStatFilter.java:124) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:99) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at org.springframework.web.filter.HttpPutFormContentFilter.doFilterInternal(HttpPutFormContentFilter.java:109) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:81) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:200) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:198) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:496) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:140) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:81) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:342) at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:803) at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66) at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:790) at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1468) at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) at java.lang.Thread.run(Thread.java:748) Caused by: java.sql.SQLException: sql injection violation, syntax error: syntax error, error in :'ERGE entry_dtc_dtl t USING ( ', expect INTO, actual IDENTIFIER pos 19, line 1, column 6, token IDENTIFIER entry_dtc_dtl : MERGE entry_dtc_dtl t USING ( SELECT '11' AS entry_code,'11-1' AS dtc_code,'11-1' AS dtc_name,'11' AS dtc_value, '' AS dtc_type, '' AS operator,'' AS operator_id,'N' AS is_save_redis ) s ON (s.entry_code = t.entry_code AND s.dtc_code = t.dtc_code) WHEN MATCHED THEN UPDATE SET t.dtc_name = s.dtc_name, t.dtc_value = s.dtc_value, t.dtc_type = s.dtc_type, t.operate_date = GETDATE(), t.operator = s.operator, t.operator_id = s.operator_id, t.is_save_redis = s.is_save_redis WHEN NOT MATCHED THEN INSERT (entry_code,dtc_code,dtc_name,dtc_value,dtc_type,operate_date,operator,operator_id,is_save_redis) VALUES (s.entry_code,s.dtc_code,s.dtc_name,s.dtc_value,s.dtc_type,GETDATE(),s.operator,s.operator_id,s.is_save_redis); at com.alibaba.druid.wall.WallFilter.checkInternal(WallFilter.java:805) at com.alibaba.druid.wall.WallFilter.connection_prepareStatement(WallFilter.java:258) at com.alibaba.druid.filter.FilterChainImpl.connection_prepareStatement(FilterChainImpl.java:568) at com.alibaba.druid.filter.FilterAdapter.connection_prepareStatement(FilterAdapter.java:930) at com.alibaba.druid.filter.FilterEventAdapter.connection_prepareStatement(FilterEventAdapter.java:122) at com.alibaba.druid.filter.FilterChainImpl.connection_prepareStatement(FilterChainImpl.java:568) at com.alibaba.druid.filter.FilterAdapter.connection_prepareStatement(FilterAdapter.java:930) at com.alibaba.druid.filter.FilterEventAdapter.connection_prepareStatement(FilterEventAdapter.java:122) at com.alibaba.druid.filter.FilterChainImpl.connection_prepareStatement(FilterChainImpl.java:568) at com.alibaba.druid.proxy.jdbc.ConnectionProxyImpl.prepareStatement(ConnectionProxyImpl.java:341) at com.alibaba.druid.pool.DruidPooledConnection.prepareStatement(DruidPooledConnection.java:350) at sun.reflect.GeneratedMethodAccessor93.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.apache.ibatis.logging.jdbc.ConnectionLogger.invoke(ConnectionLogger.java:55) at com.sun.proxy.$Proxy168.prepareStatement(Unknown Source) at org.apache.ibatis.executor.statement.PreparedStatementHandler.instantiateStatement(PreparedStatementHandler.java:87) at org.apache.ibatis.executor.statement.BaseStatementHandler.prepare(BaseStatementHandler.java:88) at org.apache.ibatis.executor.statement.RoutingStatementHandler.prepare(RoutingStatementHandler.java:59) at org.apache.ibatis.executor.SimpleExecutor.prepareStatement(SimpleExecutor.java:85) at org.apache.ibatis.executor.SimpleExecutor.doUpdate(SimpleExecutor.java:49) at org.apache.ibatis.executor.BaseExecutor.update(BaseExecutor.java:117) at org.apache.ibatis.executor.CachingExecutor.update(CachingExecutor.java:76) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:63) at com.sun.proxy.$Proxy167.update(Unknown Source) at org.apache.ibatis.session.defaults.DefaultSqlSession.update(DefaultSqlSession.java:198) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:433) ... 104 more Caused by: com.alibaba.druid.sql.parser.ParserException: syntax error, error in :'ERGE entry_dtc_dtl t USING ( ', expect INTO, actual IDENTIFIER pos 19, line 1, column 6, token IDENTIFIER entry_dtc_dtl at com.alibaba.druid.sql.parser.SQLParser.printError(SQLParser.java:344) at com.alibaba.druid.sql.parser.SQLParser.accept(SQLParser.java:352) at com.alibaba.druid.sql.parser.SQLStatementParser.parseMerge(SQLStatementParser.java:3068) at com.alibaba.druid.sql.parser.SQLStatementParser.parseStatementList(SQLStatementParser.java:326) at com.alibaba.druid.sql.parser.SQLStatementParser.parseStatementList(SQLStatementParser.java:182) at com.alibaba.druid.wall.WallProvider.checkInternal(WallProvider.java:624) at com.alibaba.druid.wall.WallProvider.check(WallProvider.java:578) at com.alibaba.druid.wall.WallFilter.checkInternal(WallFilter.java:792) ... 138 more

展开
收起
游客5qxpdicgv3nbk 2020-09-27 16:03:49 1774 分享 版权
1 条回答
写回答
取消 提交回答
  • 在实际项目(多数据源)中发现sqlserver连接中断后,无法支持自动重连,拿不到connect:

    1.首先通过我的监控页面发现 sqlserver配置的连接池 连接有效性检查类名 为 null。

    2.跟踪代码 com.alibaba.druid.pool.DruidDataSource.java initValidConnectionChecker() 方法中, 必须对应是“com.microsoft.jdbc.sqlserver.SQLServerDriver”才会实例化连接有效性检查类,那就是必须使用msbase.jar版本驱动,而我使用的是jtds-1.2.7.jar

    3.解决方式A ,替换驱动为 (msbase.jar mssqlserver.jar msutil.jar)。ops!仍然无法解决,可能是我的数据库 是SQLSERVER2008的问题?

    4.解决方式B,在2处initValidConnectionChecker()方法(889行)增加条件判断代码,使用jtds驱动也实例化MSSQLValidConnectionChecker.java()

            else if (realDriverClassName.equals(JdbcConstants.SQL_SERVER_DRIVER)
                ||realDriverClassName.equals("net.sourceforge.jtds.jdbc.Driver")
                ||realDriverClassName.equals("com.microsoft.sqlserver.jdbc.SQLServerDriver")) {
          this.validConnectionChecker = new MSSQLValidConnectionChecker();
    

    } 5.使用jtds.jar测试业务通过,sqlserver断线后可自动重连。(模拟网络中断,又恢复网络的情况,每周有个业务系统凌晨要重启路由)

    疑问: 1.三种 sqlserver 驱动 ,(msbase.jar mssqlserver.jar msutil.jar)、(sqljdbc4.jar)、(jtds-1.2.7.jar) 都调用 MSSQLValidConnectionChecker.java 作为校验类是否有其他问题?

    2.另外必须配置validationQueryTimeout参数,默认为-1 ,不启动检查.

    3.请文少和其他大神评估是否有其他影响,希望采纳意见,我是在1.0.15版本下改的测试没问题,目前jtds-1.2.7.jar 驱动用的企业应该更多。

    4.附spring-mybatis.xml 关于sqlserver的连接池配置

    2021-02-24 09:23:19
    赞同 展开评论