Spring整合MyBatis批量插入
来源:互联网 发布:淘宝联盟显示已收货 编辑:程序博客网 时间:2024/05/16 09:20
之前一直是用的for循环单条插入,后来业务量增大到几万 多的时候,会出现Connection is null的报错,自己也是头一次遇到这种业务情景,记录以下,以后懂得多了会继续更新这篇文章。
结合帖子: 论坛
配置文件
最后得出是配置文件的问题:
连接超时时间
druid.removeAbandonedTimeout=7200
如果你的项目需要运行时间很长,那么这个属性值就需要修改
批量插入
对于大批量插入需要分次。
for (int i = 1; i <= tagsGenerateModel.getTagsCounts(); i++) { serialNumber ++; String selfGrowthNo = serialNumberServiceAccess.genSerialNumber(SysConstant.TAGS_BATCH_QR_CODE_TENANTID, "pqms:tags:qrcode"+tagsId); /** 生成单元识别代码 */ String unitCode = tagsServiceComp.genUnitIdentiCode(tags, pesticideProduct, selfGrowthNo); //创建二维码 QrCode qrCode = new QrCode(); qrCode.setId(UuidUtils.newid()); qrCode.setEnterpriseId(tagsGenerateModel.getEnterpriseId()); qrCode.setQrCode(unitCode); qrCode.setScanCount(0); qrCode.setPesticideProductId(tagsGenerateModel.getProductId()); qrCode.setProductBatchId(""); qrCode.setQrCodeBatchId(tags.getId()); qrCode.setStatus(0); // 状态 0 正常 1 召回 2 作废 qrCode.setQrCodePath(""); qrCode.setCreateTime(new Date()); qrCode.setUpdateTime(new Date()); qrCode.setSerialNumber(serialNumber); qrCode.setIsDownload("0"); // 是否下载过 0 未下载过 1 下载过 qrCode.setIsActive(String.valueOf(tagsGenerateModel.getActiveMethod())); // 是否激活 0-激活,1-未激活 qrCodes.add(qrCode); unitCodeLst.add(unitCode); if (i % 1000 == 0) {//如果当前次数为1000整数倍,则为一个批次,进行批量插入 qrCodeDao.batchInsert(qrCodes); qrCodes.clear();//清空list,准备下一次存储 long endTime = System.currentTimeMillis(); logger.info("**第" + (i / 1000) + "次插入1000条数据费时:" + (endTime - startTime) + "毫秒\r\n"); startTime = System.currentTimeMillis(); } if (i == tagsGenerateModel.getTagsCounts() && qrCodes.size() > 0) {//如果全部数据 或者 剩余数据 qrCodeDao.batchInsert(qrCodes); qrCodes = null; long endTime = System.currentTimeMillis(); logger.info("**最后的" + (i % 1000) + "条数据费时:" + (endTime - startTime) + "毫秒\r\n"); } }
<insert id="batchInsert" parameterType="java.util.List"> insert into PQMS_QR_CODE (id, enterprise_id, qr_code, scan_count, pesticide_product_id, product_batch_id, qr_code_batch_id, status, qr_code_path, create_time, update_time, serial_number, is_download, is_active) values <foreach collection="list" item="item" index="index" separator=","> (#{item.id,jdbcType=VARCHAR}, #{item.enterpriseId,jdbcType=VARCHAR}, #{item.qrCode,jdbcType=VARCHAR}, #{item.scanCount,jdbcType=INTEGER}, #{item.pesticideProductId,jdbcType=VARCHAR}, #{item.productBatchId,jdbcType=VARCHAR}, #{item.qrCodeBatchId,jdbcType=VARCHAR}, #{item.status,jdbcType=INTEGER}, #{item.qrCodePath,jdbcType=VARCHAR}, #{item.createTime,jdbcType=TIMESTAMP}, #{item.updateTime,jdbcType=TIMESTAMP}, #{item.serialNumber,jdbcType=INTEGER}, #{item.isDownload,jdbcType=CHAR}, #{item.isActive,jdbcType=CHAR}) </foreach> </insert>
阅读全文