精华内容
下载资源
问答
  • 块统计,批量统计块数量,参照块数量
  • Mybatis 批量插入 数量限制

    万次阅读 2019-04-10 16:51:17
    今天下午公司技术分享,一个伙伴提到他踩过坑:mybatis批量插入时动态sql允许的最大参数数量是2100个。即下面代码中“#{…}”的数量。 <insert id="batchInsert" parameterType="list"> insert into ...

    故事

    今天下午公司技术分享,一个伙伴提到他踩过坑:mybatis批量插入时动态sql允许的最大参数数量是2100个。即下面代码中“#{…}”的数量。

    <insert id="batchInsert" parameterType="list">
      insert into Adv_permeability values
      <foreach collection="permeabilityList" separator="," item="permeability">
        (#{permeability.areaId}, #{permeability.areaName}, #{permeability.flag})
      </foreach>
    </insert>
    

    当时就有一个小伙伴不开心了,他明确表示自己曾经成功插入超过2100个参数,并当场拉出了代码证明之。由此猜测mybatis批量插入的上限是按对象数量限制的,不是参数,双方争执不下,一片欢乐。

    探究

    mybatis 真的对动态 SQL 的 参数 或者 对象 数量设定了限制么?如果有那么原因何在?如果没有,那么为什么双方都那么确定呢?难道是 数据库 不同导致的?

    本着最小投入的原则,笔者开始了测试。手头现有 SQLServer 和 Mysql 就测这两个吧。脚本使用上述的简单脚本。

    SQLServer

    对 SQLServer 进行2000次批量插入,实体参数是3个,即本次插入参数数量是 2000*3=6000,结果是 报错 了!

    com.microsoft.sqlserver.jdbc.SQLServerException: 传入的请求具有过多的参数。该服务器支持最多 2100 个参数。请减少参数的数目,然后重新发送该请求。

    可以清楚看到,错误是 SQLServer 的JDBC包抛出的。

    不过,笔者记得在用 SqlServer Management Studio 批量插入式,最大条数有 1000 的限制, 那么在用 Mybatis 时还会有么?这里将插入参数变为一个 {permeability.areaId} ,插入 1315 条,结果 报错了!

    com.microsoft.sqlserver.jdbc.SQLServerException: INSERT 语句中行值表达式的数目超出了 1000 行值的最大允许值。

    果然,是 SQLServer 数据库自己的鬼,不是 Mybatis 的锅!

    Mysql

    对 Mysql 进行同样的2000次批量插入,结果是完美执行。笔者一咬牙,来了次 200000 的亲密接触,结果 报错 了!

    com.mysql.jdbc.PacketTooBigException: Packet for query is too large (8346602 > 4194304). You can change this value on the server by setting the max_allowed_packet’ variable.

    看来 Mysql 也有限制,跟 SQLServer “数参数个数” 的限制方法不同, Mysql 对执行的SQL语句大小进行限制,相当于对字符串进行限制。根据报错内容,默认允许最大SQL是 4M 。这个错误是 Mysql 的JDBC包抛出的。

    可以使用语句查询这个值并改变:

    # 查询当前大小
    mysql> select @@max_allowed_packet;
    +----------------------+
    | @@max_allowed_packet |
    +----------------------+
    |              4194304 |
    +----------------------+
    1 row in set (0.00 sec)
    
    # 修改为256M
    mysql> SET GLOBAL max_allowed_packet=268435456;
    Query OK, 0 rows affected (0.00 sec)
    
    # 退出客户端重新登录
    mysql> select @@max_allowed_packet;
    +----------------------+
    | @@max_allowed_packet |
    +----------------------+
    |            268435456 |
    +----------------------+
    1 row in set (0.00 sec)
    

    Mybatis

    简单看一下 Mybatis 解析动态SQL的源码。

    // 开始解析
    public void parse() {
        if (!configuration.isResourceLoaded(resource)) {
            configurationElement(parser.evalNode("/mapper"));
            configuration.addLoadedResource(resource);
            bindMapperForNamespace();
        }
    
        parsePendingResultMaps();
        parsePendingChacheRefs();
        parsePendingStatements();
    }
    // 解析mapper
    private void configurationElement(XNode context) {
        try {
            String namespace = context.getStringAttribute("namespace");
            if (namespace.equals("")) {
                throw new BuilderException("Mapper's namespace cannot be empty");
            }
            builderAssistant.setCurrentNamespace(namespace);
            cacheRefElement(context.evalNode("cache-ref"));
            cacheElement(context.evalNode("cache"));
            parameterMapElement(context.evalNodes("/mapper/parameterMap"));
            resultMapElements(context.evalNodes("/mapper/resultMap"));
            sqlElement(context.evalNodes("/mapper/sql"));
            buildStatementFromContext(context.evalNodes("select|insert|update|delete"));
        } catch (Exception e) {
            throw new BuilderException("Error parsing Mapper XML. Cause: " + e, e);
        }
    }
    
    // 创建 select|insert|update|delete 语句
    private void buildStatementFromContext(List<XNode> list, String requiredDatabaseId) {
        for (XNode context : list) {
            final XMLStatementBuilder statementParser = new XMLStatementBuilder(configuration, builderAssistant, context, requiredDatabaseId);
            try {
                statementParser.parseStatementNode();
            } catch (IncompleteElementException e) {
                configuration.addIncompleteStatement(statementParser);
            }
        }
    }
    
    // 填充参数,创建语句
    public BoundSql getBoundSql(Object parameterObject) {
        DynamicContext context = new DynamicContext(configuration, parameterObject);
        rootSqlNode.apply(context);
        SqlSourceBuilder sqlSourceParser = new SqlSourceBuilder(configuration);
        Class<?> parameterType = parameterObject == null ? Object.class : parameterObject.getClass();
        SqlSource sqlSource = sqlSourceParser.parse(context.getSql(), parameterType, context.getBindings());
        BoundSql boundSql = sqlSource.getBoundSql(parameterObject);
        for (Map.Entry<String, Object> entry : context.getBindings().entrySet()) {
            boundSql.setAdditionalParameter(entry.getKey(), entry.getValue());
        }
        return boundSql;
    }
    

    从开始到结束, Mybatis 都没有对填充的条数和参数的数量做限制。

    结语

    • SqlServer 对语句的条数和参数的数量都有限制,分别是 1000 和 2100。
    • Mysql 对语句的长度有限制,默认是 4M。
    • Mybatis 对动态语句没有数量上的限制。
    展开全文
  • 主要介绍了python:批量统计xml中各类目标的数量案例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
  • tiff,jpg,pdf数量批量统计工具,工具很小,速度很快,比较方便!!!
  • 批量添加删除指定数量的用户.pdf
  • 解除百度网盘转存的时候超出数量限制.内附详细的使用说明,一看就会。
  • CAD倒圆角,快捷键WK,不限形状不限工件数量不限系统不限CAD版本
  • 使用MyBatis数量批量插入(MySql)

    千次阅读 2019-03-08 10:52:31
    由于项目需要生成多条数据,并保存到数据库当中,在程序中封装了一个List集合对象,然后需要把该集合中的实体插入到数据库中,项目使用了Spring+MyBatis,所以打算使用MyBatis批量插入,应该要比循环插入的效果更好,...

    由于项目需要生成多条数据,并保存到数据库当中,在程序中封装了一个List集合对象,然后需要把该集合中的实体插入到数据库中,项目使用了Spring+MyBatis,所以打算使用MyBatis批量插入,应该要比循环插入的效果更好,由于之前没用过批量插入,在网上找了一些资料后最终实现了,把详细过程贴出来。供以后查阅和学习。

    java代码:

    注意:这里循环的时候需new 出来新的对象,而不能通过循环改变属性的值就认为这是一个新的对象了,通俗的说就是new ReddemCode()要放在for循环的里面.

    xxxMapper.xml

     1 <!-- 批量插入生成的兑换码 -->
     2      <insert id ="insertCodeBatch" parameterType="java.util.List" >
     3             <selectKey resultType ="java.lang.Integer" keyProperty= "id"
     4                  order= "AFTER">
     5                 SELECT LAST_INSERT_ID()
     6             </selectKey >
     7            insert into redeem_code
     8            (bach_id, code, type, facevalue,create_user,create_time)
     9            values
    10             <foreach collection ="list" item="reddemCode" index= "index" separator =",">
    11                 (
    12                 #{reddemCode.batchId}, #{reddemCode.code},
    13                 #{reddemCode.type},
    14                 #{reddemCode.facevalue},
    15                 #{reddemCode.createUser}, #{reddemCode.createTime}
    16                 )
    17             </foreach >
    18      </insert >

     

    xxxMapper.java(部分)

    1 int insertCodeBatch(List<ReddemCode > reddemCodeList);
    

    对于foreach标签的解释参考了网上的资料,具体如下:

    foreach的主要用在构建in条件中,它可以在SQL语句中进行迭代一个集合。

    foreach元素的属性主要有 item,index,collection,open,separator,close。

    item表示集合中每一个元素进行迭代时的别名,index指定一个名字,用于表示在迭代过程中,每次迭代到的位置,open表示该语句以什么开始,separator表示在每次进行迭代之间以什么符号作为分隔 符,close表示以什么结束,在使用foreach的时候最关键的也是最容易出错的就是collection属性,该属性是必须指定的,但是在不同情况 下,该属性的值是不一样的,主要有一下3种情况:

    1.如果传入的是单参数且参数类型是一个List的时候,collection属性值为list

    2.如果传入的是单参数且参数类型是一个array数组的时候,collection的属性值为array

    3.如果传入的参数是多个的时候,我们就需要把它们封装成一个Map了,当然单参数也可以封装成map

     

    使用批量插入执行的SQL语句应该等价于:

     

     insert into redeem_code (batch_id, code, type, facevalue,create_user,create_time)
     values
     (?,?,?,?,?,? ),(?,?,?,?,?,? ),(?,?,?,?,?,? ),(?,?,?,?,?,? )
    展开全文
  • 批量修改magento产品库存数量

    千次阅读 2013-06-02 19:16:05
    天介绍的这个方法是使用外部php代码实现批量更改库存数量。 First,准备一个csv文件,这个文件可以包含下面所有的这些字段   但是一般我们只需要sku和qty这两个字段。(在csv文件里边修改你需要修改的qty的数量...
    天介绍的这个方法是使用外部php代码实现批量更改库存数量。 
    

    First,准备一个csv文件,这个文件可以包含下面所有的这些字段
     
    但是一般我们只需要sku和qty这两个字段。(在csv文件里边修改你需要修改的qty的数量。)
     
    保存成CSV格式,注意另存的时候选择UTF-8编码,Mangeto只能识别UTF-8。 将这个文件存到./app/var/import/updateStockLevels.csv.
    之后,创建一个php文件,内容如下:
    <?
     define('MAGENTO', realpath(dirname(__FILE__)));
     require_once MAGENTO . '/app/Mage.php';
     umask(0);
     Mage::app()->setCurrentStore(Mage_Core_Model_App::ADMIN_STORE_ID);
     $count = 0;
     $file = fopen(MAGENTO . '/var/import/updateStockLevels.csv', 'r');
     while (($line = fgetcsv($file)) !== FALSE) {
     if ($count == 0) {
     foreach ($line as $key=>$value) {
     $cols[$value] = $key;
     }
     }
     $count++;
     if ($count == 1) continue;
     #Convert the lines to cols
     if ($count > 0) {
     foreach($cols as $col=>$value) {
     unset(${$col});
     ${$col} = $line[$value];
     }
     }
     // Check if SKU exists
     $product = Mage::getModel('catalog/product')->loadByAttribute('sku',$sku);
     if ( $product ) {
     $productId = $product->getId();
     $stockItem = Mage::getModel('cataloginventory/stock_item')->loadByProduct($productId);
     $stockItemId = $stockItem->getId();
     $stock = array();
     if (!$stockItemId) {
     $stockItem->setData('product_id', $product->getId());
     $stockItem->setData('stock_id', 1);
     } else {
     $stock = $stockItem->getData();
     }
     foreach($cols as $col=>$value) {
     $stock[$col] = $line[$value];
     }
     foreach($stock as $field => $value) {
     $stockItem->setData($field, $value?$value:0);
     }
     $stockItem->save();
     unset($stockItem);
     unset($product);
     }
     echo "<br />Stock updated $sku";
     }
     fclose($file);
    ?>
    存为quick_updateStock.php, 在浏览器运行这个文件即可。

    展开全文
  • Metal之MTLBuffer批量加载顶点数量较多的图形渲染.pdf
  • 批量上传演示(支持文件数量和尺寸限制).rar
  • 有限制的数据库 转载自 https://blog.csdn.net/qq_36773257/article/details/79895819 其中 SqlServer 对语句的条数和参数的数量都有限制,分别是 1000 和 2100。 Mysql 对语句的长度有限制,默认是 4M。 Oracle...

    根据查到的资料显示
    Mybatis 对动态语句没有数量上的限制。
    有限制的为数据库
    转载自
    https://blog.csdn.net/qq_36773257/article/details/79895819
    其中
    SqlServer 对语句的条数和参数的数量都有限制,分别是 1000 和 2100。
    Mysql 对语句的长度有限制,默认是 4M。

    Oracle限制1000条

    展开全文
  • 我在训练人脸分类器时,需要随机抽取一定数量的图片,目的是保持训练样本的多样性,使用MATLAB编程抽取,足足花了两天时间才搞好,在回过头看,却很简单,这样大家也就少走了许多弯路,分享给大家,如大家有更好的...
  • Metal之MTLBuffer批量加载顶点数量较多的图形渲染: 详细的实现了完整的逻辑和详尽的注释说明, 以及顶点数据的存储方式以及它们的应用场景
  • 批量标注数量大的地图注记

    千次阅读 2015-11-03 15:38:35
    相比通过CAD和文本数据集的方式添加地图注记,通过标签专题地图添加注记更加智能,标签专题图将依据数据集中的某个字段,对地图要素添加注记。在数据量较大的地图注记生产中,标签专题图的方式更加方便、易用。
  • 最近在做学校的srt,需要数据清洗,...能实现批量读取某个文件夹内的所有docx文件,然后计算docx里的表格数量。   import os import docx # 判断文件后缀 def endWith(s, *endstring): array = map(s.end...
  • KindEditor批量图像上载,默许答应用户一起上载20张图像,单张图像容量不超越1MB。有时不满足咱们的需要,就需要修正KE批量上载图像的个数和单个图像巨细限制。KindEditor 4.1.11: 办法一:调用KE时装备好参数就行...
  • google-images-download 用于批量下载图片 google-images-download 是个 Python 脚本。一条命令,就完成 Google 图片搜索和批量下载功能。而且,这工具还跨平台运行,Linux, Windows 和 macOS 都支持。简直是懒人...
  • 提供一个NodeJS环境下,基于TinyPNG服务的,批量压缩任意数量图片的工具
  • 整个批量请求需要被加载到接受我们请求节点的内存里,所以请求越大,给其它请求可用的内存就越小。有一个最佳的 bulk 请求大小。超过这个大小,性能不再提升而且可能降低。 最佳大小,当然并不是一个固定的数字。它...
  • python:批量统计xml中各类目标的数量

    千次阅读 热门讨论 2019-01-21 20:03:03
    所以重新写了一个Python的,直接读取xml文件夹路径就可以,不用预先知道类别,直接能够检测出所有类别的目标名称及其对应的数量。 分享出来给大家。 代码如下: # -*- coding:utf-8 -*- import os import xml....
  • 压缩包内BatUTF8Conv.exe--批量将文件格式转换utf-8, 每次批量转换文件数量大概200多个
  • 文章目录一、前言二、批量插入前准备1、插入到数据表的字段2、计算一行字段占用的空间3、在数据里做插入操作的时候,整体时间的分配三、批量插入数据测试1、SQL语句的大小限制2、查看服务器上的参数:3、计算一次能...
  • PHP源码 图片批量上传,不限数量,上传之后马上可以直接显示图片,适合做淘宝宝贝描述.参考网店:http://tdwolf.taobao.com
  • CakePHP中的批量保存及批量更新

    千次阅读 2017-06-21 23:05:24
    在CakePHP中,批量保存及批量更新主要用到 newEntities() 、patchEntities()、saveMany()及updateAll()方法。
  • WORD批量修改文献引用上标

    千次阅读 2020-06-26 20:41:37
    当论文文献数量较多时,此时需要修改文献引用上标特别麻烦,尤其稍不留神便出错。本文主要针对两种情况批量修改上标(以word2016例)。 一、批量修改如[12]、[30]格式的上标 1、点击word开始页面的替换选项卡,或...
  • 前言我们在需要创建多个用户的时候,使用手工单独创建是比较耗费精力的事情,我们可以通过shell脚本实现批量添加用户,实现指定数量用户、创建用户默认名、创建默认密码。正文① 关键命令1、read命令从键盘读取变量...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 168,039
精华内容 67,215
关键字:

多少数量为批量