已解决
springboot解决multi-statement not allow(已部署生产)
来自网友在路上 174874提问 提问时间:2023-10-09 16:23:40阅读次数: 74
最佳答案 问答题库748位专家为你答疑解惑
文章目录
- 1、问题复现
- 2、解决方案
- 3、解决方案对应的代码
最近有一个需求,要批量更新数据库,那肯定得上批量更新了。
springboot支持批量更新的配置很简单。如下:
jdbc:mysql://MYSQL_IP: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 {//获取到当前项目中的数据源@Autowiredprivate DataSource dataSource;public static void main(String[] args) {SpringApplication.run(Application.class, args);log.info("启动成功。。。");}@Overridepublic void run(String... args) {try {DruidDataSource druidDataSource = (DruidDataSource) dataSource;List<Filter> 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);}}@Beanpublic WallFilter wallFilter(){WallFilter wallFilter = new WallFilter();wallFilter.setConfig(wallConfig());return wallFilter;}@Beanpublic WallConfig wallConfig() {WallConfig config = new WallConfig();//允许一次执行多条语句config.setMultiStatementAllow(true);//允许执行DDL语句config.setNoneBaseStatementAllow(true);return config;}
}
查看全文
99%的人还看了
相似问题
- ODBC配置数据源及相关问题(“找不到工程和库”“实时错误91对象变量或with块变量未设置”等)
- .NET6使用MiniExcel根据数据源横向导出头部标题及数据
- 【Spring】使用三方包进行数据源对象(数据库)管理
- mybatis-plus3.5.3.1 支持不同数据源sql适配
- Python与ArcGIS系列(六)查找和修复数据源
- SpringBoot实现mysql与clickhouse多数据源
- SpringBoot使用MyBatis多数据源
- springboot中多数据源配置和使用
- 若依分离版——配置多数据源(mysql和oracle),实现一个方法操作多个数据源
- GNSS常用数据源汇总
猜你感兴趣
版权申明
本文"springboot解决multi-statement not allow(已部署生产)":http://eshow365.cn/6-17871-0.html 内容来自互联网,请自行判断内容的正确性。如有侵权请联系我们,立即删除!
- 上一篇: 【Linux】信号屏蔽与信号捕捉的原理与实现(附图解与代码)
- 下一篇: log4qt集成使用