mybatis批量查询引发的血案

mybatis提供了foreach语法用于所谓的批量查询,使用方式如下:

①、定义接口

/**
     * 批量获取任务id列表对应的任务名称
     * @param taskIdList:任务id列表
     * @return :任务id,及对应的任务名称的列表信息
     */
    List<Map<String, Object>> batchSelectTaskNameById(@Param("taskIdList") List<String> taskIdList);

②、xml中的实现

<select id="batchSelectTaskNameById" parameterType="list" resultType="map">
    SELECT id,name
    FROM tb_task
    WHERE 1=1  AND id IN
    <foreach collection="taskIdList" item="item" index="index" open="(" separator="," close=")">
        #{item}
    </foreach>
</select>

项目中就按照如上方式进行了批量查询,在开发过程中未发现什么问题,正常使用,感觉还提高了代码运行效率。

但是问题出现在项目内测过程中,大概用户量仅达到几百,出现的状况是:涉及到该种方式批量查询信息的接口,时而效率正常几十毫秒而已,时而效率异常慢,感觉是被阻塞一样5秒到10秒左右。排除了是因为传入list过长的原因,仅传入长度3,4的列表也会出现上述问题。

解决办法:将查询内容的信息先在程序代码中处理,即将list列表拼接成sql语句字符串形式,直接将条件当做参数传入xml中。

这样处理后既可以正常稳定进行批量查询了。

所以项目中勿使用foreach方式去批量查询,切记,坑很深。

原文地址:https://www.cnblogs.com/conswin/p/11261211.html