批处理插入数据不成功

批处理插入数据不成功

老师好,这里存在这样一个问题,当批处理插入一万条数据的时候,程序一直运行不结束,当换成1千条数据的时候能插入成功速度却很慢,而且比单条插入的速度还要慢,这是什么原因

批量插入一千条数据的运行结果

https://img1.sycdn.imooc.com//climg/64dcb3de094ee98c16590420.jpg

单条插入一万条数据的运行结果

https://img1.sycdn.imooc.com//climg/64dcb37c0912645c19190454.jpg

由上面的数据看来批量插入一千条数据的时间甚至不如单条插入一万条数据的时间

如果批量插入一万条数据程序会一直执行不结束

https://img1.sycdn.imooc.com//climg/64dcb4b309819e5318550421.jpg

下面是代码

mapper

<insert id="batchInsert" parameterType="java.util.List">
    INSERT INTO t_goods(title, sub_title, original_cost, current_price, discount, is_free_delivery, category_id)
    VALUES
    <foreach collection="list" item="item" index="index" separator=",">
        (#{item.title},#{item.subTitle}, #{item.originalCost}, #{item.currentPrice}, #{item.discount}, #{item.isFreeDelivery}, #{item.categoryId})
    </foreach>
</insert>

测试代码

 /**
     * 批量插入测试
     * @throws Exception
     */
    @Test
    public void testBatchInsert() throws Exception {
        SqlSession session = null;
        try {
            long st = new Date().getTime();
            session = MyBatisUtils.openSession();
            List list = new ArrayList();
            for (int i = 0; i < 10000; i++) {
                Goods goods = new Goods();
                goods.setTitle("测试商品");
                goods.setSubTitle("测试子标题");
                goods.setOriginalCost(200f);
                goods.setCurrentPrice(100f);
                goods.setDiscount(0.5f);
                goods.setIsFreeDelivery(1);
                goods.setCategoryId(43);
                //insert()方法返回值代表本次成功插入的记录总数

                list.add(goods);
            }
            session.insert("goods.batchInsert", list);
            session.commit();//提交事务数据
            long et = new Date().getTime();
            System.out.println("执行时间:" + (et - st) + "毫秒");
//            System.out.println(goods.getGoodsId());
        } catch (Exception e) {
            if (session != null) {
                session.rollback();//回滚事务
            }
            throw e;
        } finally {
            MyBatisUtils.closeSession(session);
        }
    }

    /**
     * 10000次数据插入对比测试用例
     * @throws Exception
     */
    @Test
    public void testInsert1() throws Exception {
        SqlSession session = null;
        try{
            long st = new Date().getTime();
            session = MyBatisUtils.openSession();
            List list = new ArrayList();
            for(int i = 0 ; i < 10000 ; i++) {
                Goods goods = new Goods();
                goods.setTitle("测试商品");
                goods.setSubTitle("测试子标题");
                goods.setOriginalCost(200f);
                goods.setCurrentPrice(100f);
                goods.setDiscount(0.5f);
                goods.setIsFreeDelivery(1);
                goods.setCategoryId(43);
                //insert()方法返回值代表本次成功插入的记录总数

                session.insert("goods.insert" , goods);
            }

            session.commit();//提交事务数据
            long et = new Date().getTime();
            System.out.println("执行时间:" + (et-st) + "毫秒");
//            System.out.println(goods.getGoodsId());
        }catch (Exception e){
            if(session != null){
                session.rollback();//回滚事务
            }
            throw e;
        }finally {
            MyBatisUtils.closeSession(session);
        }
    }


正在回答 回答被采纳积分+1

登陆购买课程后可参与讨论,去登陆

1回答
好帮手慕小蓝 2023-08-17 09:43:57

同学你好,MySql数据库本身默认是不支持批量操作的,需要对其进行设置之后才能支持批量操作。

同学可以尝试在MySql的URL配置中加入rewriteBatchedStatements=true子句,这个子句可以使得MySql数据库本身也支持批处理形式。

祝学习愉快~

  • 提问者 _大臣呀 #1

    你好,刚刚尝试了一下,问题并没有得到解决

    <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/babytun?useUnicode=true&amp;characterEncoding=UTF-8&amp;serverTimezone=Asia/Shanghai&amp;rewriteBatchedStatements=true"/>


    2023-08-17 13:00:11
  • 好帮手慕小蓝 回复 提问者 _大臣呀 #2

    同学你好,老师使用同学提供的代码并没有出现这样的问题,所以代码本身并没有错。并且老师这边测试10000条大约耗时2500ms,而同学提供的图片中耗时均超过10000ms,所以猜测可能仅仅是电脑的性能较差导致的,与数据库或者代码无关。

    如果同学使用课程源码进行测试,依然存在这样的问题,那么就可以确定是电脑性能导致的。那么就无需关心测试结果,只需要掌握编码方式即可。

    祝学习愉快~

    2023-08-17 14:21:20
  • 提问者 _大臣呀 回复 好帮手慕小蓝 #3

    电脑性能不差啊,两万多的游戏本。好吧

    2023-08-17 14:23:51
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师