MySQL中jdbc驱动开启批量执行sql参数allowMultiQueries

在维护一个项目中,碰到了一个奇怪的问题:在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禁止这种写法,但是测试环境又一切正常,查了半天搞不定后咨询大佬才得以解决。

经过这么一个坑,也算长知识学习了。


觉得内容还不错?打赏个钢镚鼓励鼓励!!👍