Skip to content

服务器托管,北京服务器托管,服务器租用-价格及机房咨询

Menu
  • 首页
  • 关于我们
  • 新闻资讯
  • 数据中心
  • 服务器托管
  • 服务器租用
  • 机房租用
  • 支持中心
  • 解决方案
  • 联系我们
Menu

springboot解决multi-statement not allow(已部署生产)

Posted on 2023年11月16日2023年11月16日 by hackdl

文章目录

    • 1、问题复现
    • 2、解决方案
    • 3、解决方案对应的代码

最近有一个需求,要批量更新数据库,那肯定得上批量更新了。

springboot支持批量更新的配置很简单。如下:

jdbc:mysql://MYSQL_I服务器托管网P:MYSQL_PORT/MYSQL_DATABASE?allowMultiQueries=true

1、问题复现

本地测试没有问题,部署到测试环境后,就会报错:

org.springframework.jdbc.UncategorizedSQLException: 
### Error updating database.  Cause: java.sql.SQLException: sql injection violation, dbType mysql, druid-version 1.2.16, multi-statement not allow : 
            UPDATE order SET express = ?,company = ? WHERE code = ?
         ; 
            UPDATE order SET express = ?,company = ? WHERE code = ?
         ; 
            UPDATE order SET express = ?,company = ? WHERE code = ?
         ; 
            UPDATE order SET express = ?,company = ? WHERE code = ?
            at com.alibaba.druid.wall.WallFilter.checkInternal(WallFilter.java:835)
	at com.alibaba.druid.wall.WallFilter.connection_prepareStatement(WallFilter.java:270)
	at com.alibaba.druid.filter.FilterChainImpl.connection_prepareStatement(FilterChainImpl.java:531)
	at com.alibaba.druid.filter.FilterAdapter.connection_prepareStatement(FilterAdapter.java:908)
	at com.alibaba.druid.filter.FilterEventAdapter.connection_prepareStatement(FilterEventAdapter.java:116)

报错很明显就是,druid数据源默认不允许这种批量更新。看报错的堆栈,是一个叫做WallFilter的过滤器中报出来的。因为我们在springboot的配置文件中添加了filters:stat,wall。就是这个wall的配置引起的。

2、解决方案

解决方案有两种。
第一:很简单,既然是wall引起的,直接把它去掉不就行了。这种方案是可以的。
第二:如果你确实用到了这个wall呢?那就得想办法,带着wall的同时,还要支持批量更新。
第一种,不说了,直接说第二种方案。我对druid的源码也不熟悉,碰到了这个问题,也是google,
网上有一大堆解决方案,基本都是说要给WallFilter设置上一个属性:
multiStatementAllow = true。
首先来说,解决思路没有问题,就是将这个属性multiStatementAllow的值设置为true,关键是怎么做是有效的?反正我试了网上的思路,不管用,还是报错,要不然就是不报错了,但是会覆盖掉配置文件中数据源相关的配置。

3、解决方案对应的代码

直接贴代码,亲测可行。
解决思路很简单,首先将我们已经生成的数据源注入到代码中,然后添加MultiStatementAllow=true的配置。

@SpringBootApplication()
public class Application implements CommandLineRunner {
	//获取到当前项目中的数据源
	@Autowired
	private DataSource dataSource;

	public static void main(String[] args) {
		SpringApplication.run(Application.class, args);
		log.info("启动成功。。。");
	}

	@Override
	public void run(String... args) {
		try {
			DruidDataSource druidDataSource = (DruidDataSource) dataSource;
			ListFilter> proxyFilters = druidDataSource.getProxyFilters();
			for (Filter filter : proxyFilters) {
				if (filter instanceof WallFilter) {
					((WallFilter) filter).setConfig(wallConfig());
				}
			}
			druidDataSource.setFilters("stat,wall");
			log.info("druid配置信息:{}",druidDataSource);
		} catch (Exception e) {
			log.error("给druid数据源设置过滤器异常",e);
		}
	}

	@Bean
	public WallFilter wallFilter(){
		WallFilter wallFilter = new WallFilter();
		wallFilter.set服务器托管网Config(wallConfig());
		return wallFilter;
	}

	@Bean
	public WallConfig wallConfig() {
		WallConfig config = new WallConfig();
		//允许一次执行多条语句
		config.setMultiStatementAllow(true);
		//允许执行DDL语句
		config.setNoneBaseStatementAllow(true);
		return config;
	}
}

服务器托管,北京服务器托管,服务器租用 http://www.fwqtg.net

相关推荐: Discourse 附件无法显示的跟进

今天登录表以后,发现数据又被清理了部分。 然后我们又重新使用 SQL 导入了数据。 这个让我们感觉 Discourse 的系统中应该设置了自动清理程序,在这个自动清理程序中会对认为没有使用的附件或者图片进行清理。 因为我们更换了存储空间,所以这会导致自动清理程…

Related posts:

  1. 机柜租赁
  2. 高效稳定的西宁IP服务器托管服务
  3. 探究服务器租用的作用与意义
  4. 服务器托管租用合同经典版样式
  5. 重庆服务器托管热网:优质服务的首选

服务器托管,北京服务器托管,服务器租用,机房机柜带宽租用

服务器托管

咨询:董先生

电话13051898268 QQ/微信93663045!

上一篇: 深入跨域 – 从初识到入门
下一篇: 利用OpenNJet HA Copilot 实现高可用部署 (一)

最新更新

  • 分布式springcloud
  • 【面试题:对象引用在内存中存在何处?基于何种计算机原理获取对象的值?】
  • 本地部署 ChatGLM3
  • C#调用外部Api并解析返回的json的参数
  • leetcode_1792 最大平均通过率

随机推荐

  • 【译】为什么命名“它”为依赖属性(Dependen
  • 托管idc机房托管
  • 深入解析非托管服务器:自主掌控的高效托管解决方案
  • idc机柜
  • 台湾服务器托管服务:稳定、可靠的选择

客服咨询

  • 董先生
  • 微信/QQ:93663045
  • 电话:13051898268
  • 邮箱:dongli@hhisp.com
  • 地址:北京市石景山区重聚园甲18号2层

友情链接

  • 服务器托管
  • 机房租用托管
  • 服务器租用托管
©2023 服务器托管,北京服务器托管,服务器租用-价格及机房咨询 京ICP备13047091号-8