zoukankan      html  css  js  c++  java
  • 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方式去批量查询,切记,坑很深。

  • 相关阅读:
    CentOS6、CentOS7配置Base源和epel源
    谢孟媛_初级英文文法_讲义!全!!
    java动态代理实现与原理详细分析
    聊聊spring的那些扩展机制
    springboot+druid+mybatis plus的多数据源配置
    基于CAS实现SSO单点登录
    mybatisPlus整理
    Python实现1-100之和
    python接口自动化--get请求
    使用fiddler进行接口测试
  • 原文地址:https://www.cnblogs.com/conswin/p/11261211.html
Copyright © 2011-2022 走看看