在维护一个项目中,碰到了一个奇怪的问题:在mybaits的一个批量更新数据的方法中,使用了如下的xml配置
<update id="batchUpdate" parameterType="java.util.List" >
<foreach collection="list" item="item" open="" close="" separator=";">
UPDATE t_user SET
name=#{item.name},
email=#{item.email}
WHERE id=#{item.id}
</foreach>
</update>
即遍历list中的数据,生成多条更新语句,再执行这个sql。但是奇怪的是,在开发环境和生产环境测试没有任何问题,在预生产环境却一直报错。
经过一顿踩坑查找发现,原来mysql有一个批量执行sql的开关,默认是关闭的,即禁止批量执行sql。这个开关的参数是allowMultiQueries。
配置这个开关方法:在mysql的jdbc链接上直接配置,如:
jdbc:mysql://127.0.0.1:3306/database?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true
这个问题比较坑的地方在于:
1、维护这个项目的上一批人各个环境的jdbc配置没有同步,偏偏就预生产环境没有配置这个参数。
2、jdbc禁止批量执行sql抛出的异常报错只会说sql有语法错误,但是没有说具体的原因。导致我排查了大半天sql都觉得没有问题。
3、我本人第一次知道mysql还有allowMultiQueries这个配置,所以没往这方面想,认为代码有问题,以为是mybatis禁止这种写法,但是测试环境又一切正常,查了半天搞不定后咨询大佬才得以解决。
经过这么一个坑,也算长知识学习了。