当前位置: 首页 > wzjs >正文

网站建设与维护案例江苏省建设考试培训网站

网站建设与维护案例,江苏省建设考试培训网站,网站和app的开发成本,wordpress文章模板编辑器1. 介绍 在应用开发中,当数据不大时使用 for循环一条一条的插入,这个方式比较简单直观灵活,但是这个对于大的数据集,使用for循环逐条插入数据可能会导致性能问题。在网络延迟高或数据库负载大的情况下。使用for循环进行数据插入时…

1. 介绍

  1. 在应用开发中,当数据不大时使用 for循环一条一条的插入,这个方式比较简单直观灵活,但是这个对于大的数据集,使用for循环逐条插入数据可能会导致性能问题。
  2. 在网络延迟高或数据库负载大的情况下。使用for循环进行数据插入时,需要注意事务管理,确保数据的一致性和完整性。如果不适当地管理事务,可能会导致数据不一致或丢失。
  3. 每次循环迭代都需要建立和关闭数据库连接,这可能会导致额外的数据库连接开销,影响性能。

针对有大数据量批量插入语句的场景,此时有两种方案 1. 多条insert同时提交 ,2. insert…vaues (),()的语句形式批量提交。

在DM中推荐使用PreparedStatement预编译多条insert语句 然后executeBatch的操作也就是第一种方法

2. 使用PreparedStatement预编译

使用预处理的方式进行批量插入是一种常见的优化方法,它可以显著提高插入操作的性能。

优点:

  • 性能提升: 预处理可以减少每次插入操作中的数据库通信次数,从而降低了网络通信的开销,提高了插入操作的效率和性能。
  • 减少数据库负载: 将多条数据组合成批量插入的方式可以减少数据库服务器的负载,降低了数据库系统的压力,有助于提高整个系统的性能。
  • 减少连接开销: 预处理可以减少每次循环迭代中建立和关闭数据库连接的开销,从而节省了系统资源,提高了连接的复用率。
  • 事务管理:可以将多个插入操作放在一个事务中,以确保数据的一致性和完整性,并在发生错误时进行回滚,从而保证数据的安全性。

缺点:

  • 内存消耗: 将多条数据组合成批量插入的方式可能会增加内存消耗,特别是在处理大量数据时。因此,需要注意内存的使用情况,以避免内存溢出或性能下降。

所以由此可见预编译方式性能较好,如果想避免内存问题的话,其实使用分批插入也可以解决这个问题。

3. spring中标准的单条提交写法(不推荐)

    @Overridepublic void batchInsertGOOD(BRAND bRAND, SHELL sHELL) throws IOException {String[] good_string = null;Integer CATEGORY_ID = 1;for (int i = 0; i < 100000; i++) {GOOD good = new GOOD();good.setBRAND_ID(bRAND.getID());good.setBRAND_UUID(bRAND.getBRAND_ID());good.setSELLER_ID(sHELL.getID());good.setSELLER_UUID(sHELL.getSHELL_ID());good.setGOOD_ID(CustomUtil.getUUID());good.setNAME(i+good_string[2]);good.setPRICE(new BigDecimal(good_string[1]));good.setGOOD_DESC("这时商品介绍---"+i+"----"+good_string[2]);good.setIS_DELETE(0);gOODMapper.insert(good);}}

使用com.baomidou.mybatisplus.core.mapper.BaseMapper

4. insert…vaues (),()的语句形式批量提交 (不推荐)

insert…vaues (),() 的语句形式批量提交。使用mysql数据库的话通常使用的这种写法。

这种写法会导致sql语句会非常大,不仅容易超出的sql长度限制,也会容易造成oom。

   @Overridepublic void batchInsertGOOD_CUSTOM_T(BRAND bRAND, SHELL sHELL) throws IOException {List<GOOD> goodLists = new ArrayList<>();String[] good_string = null;Integer CATEGORY_ID = 1;for (int i = 0; i < 100000; i++) {GOOD good = new GOOD();good.setBRAND_ID(bRAND.getID());good.setBRAND_UUID(bRAND.getBRAND_ID());good.setSELLER_ID(sHELL.getID());good.setSELLER_UUID(sHELL.getSHELL_ID());good_string = CustomUtil.readTargetFileNum(RandomUtil.randomInt(1, 15),StrUtil.trim(bRAND.getBRAND_JC()));//产品类型good.setCATEGORY_ID(RandomUtil.randomInt(1, 10));good.setGOOD_ID(CustomUtil.getUUID());good.setNAME(i+good_string[2]);good.setPRICE(new BigDecimal(good_string[1]));good.setGOOD_DESC("这时商品介绍---"+i+"----"+good_string[2]);good.setIS_DELETE(RandomUtil.randomInt(0, 1));goodLists.add(good);//每5000次 提交一次数据if(i%5000==0&&i!=0){gOODMapper.batchInsertList(goodLists);goodLists.clear();}}if(goodLists.size()!=0){gOODMapper.batchInsertList(goodLists);}}

在Myabtis中xml文件的写法,使用foreach标签循环变量结果集

<insert id="batchInsertList" parameterType="java.util.List">insert into "DM_GOODS"( "GOOD_ID", "NAME", "PRICE", "GOOD_DESC", "BRAND_ID", "BRAND_UUID", "CATEGORY_ID", "SELLER_ID", "SELLER_UUID", "IS_DELETE")VALUES<foreach collection="goodsList" item="good" separator=",">(#{good.GOOD_ID},#{good.NAME},#{good.PRICE},#{good.GOOD_DESC},#{good.BRAND_ID},#{good.BRAND_UUID},#{good.CATEGORY_ID},#{good.SELLER_ID},#{good.SELLER_UUID},#{good.IS_DELETE})</foreach></insert>

在DM中如果拼接的?参数过多时,会报变量空间溢出这个问题,此时查看日志会发现有多条数据就要拼接多少次。

5. mybatis自带的savebatch方法(推荐)


@Service
public class GOODServiceImpl extends ServiceImpl<GOODMapper, GOOD> implements GOODService {@Autowiredprivate GOODService gOODService;@Overridepublic void batchInsertGood_Mys_SaveBatch(BRAND bRAND, SHELL sHELL) throws IOException {List<GOOD> goodLists = new ArrayList<>();String[] good_string = null;Integer CATEGORY_ID = 1;for (int i = 0; i < 100000; i++) {GOOD good = new GOOD();good.setBRAND_ID(bRAND.getID());good.setBRAND_UUID(bRAND.getBRAND_ID());good.setSELLER_ID(sHELL.getID());good.setSELLER_UUID(sHELL.getSHELL_ID());good_string = CustomUtil.readTargetFileNum(RandomUtil.randomInt(1, 15),StrUtil.trim(bRAND.getBRAND_JC()));//产品类型good.setCATEGORY_ID(RandomUtil.randomInt(1, 10));good.setGOOD_ID(CustomUtil.getUUID());good.setNAME(i+good_string[2]);good.setPRICE(new BigDecimal(good_string[1]));good.setGOOD_DESC("这时商品介绍---"+i+"----"+good_string[2]);good.setIS_DELETE(RandomUtil.randomInt(0, 1));goodLists.add(good);//每5000次 提交一次数据if(i%1000==0&&i!=0){//ServiceImpl的saveBatch方法,默认batchsize是1000gOODService.saveBatch(goodLists);goodLists.clear();}}if(goodLists.size()!=0){gOODService.saveBatch(goodLists);}}}

通过查看sqllog日志,发现saveBatch接口使用PreparedStatement预编译多条insert语句 然后executeBatch提交。



6. savebatch源码分析

eg:在DM中没有rewriteBatchedStatements 参数,因为跟mysql的驱动内部的executeBatch()函数实现不同。

6.1 com.baomidou.mybatisplus.extension.toolkit.SqlHelper#executeBatch

executeBatch函数用于执行批量操作。主要功能如下:

  1. 检查批次大小是否合法。
  2. 如果数据集合不为空,则调用另一个 executeBatch 方法,逐个处理集合中的元素,并在达到批次大小或处理完所有元素时刷新语句。
  3. sqlSession.flushStatements将一个个单条插入的insert语句分批次进行提交,用的是同一个sqlSession。
    public static <E> boolean executeBatch(Class<?> entityClass, Log log, Collection<E> list, int batchSize, BiConsumer<SqlSession, E> consumer) {Assert.isFalse(batchSize < 1, "batchSize must not be less than one");return !CollectionUtils.isEmpty(list) && executeBatch(entityClass, log, sqlSession -> {int size = list.size();int i = 1;for (E element : list) {consumer.accept(sqlSession, element);if ((i % batchSize == 0) || i == size) {sqlSession.flushStatements();}i++;}});}

6.2 org.apache.ibatis.executor.BatchExecutor#doFlushStatements

doFlushStatements函数处理批量执行 SQL 语句并返回结果。主要功能如下:

  1. 如果是回滚操作,直接返回空列表。
  2. 遍历 statementList,对每个 Statement 执行批量更新,并处理生成的主键。
  3. 捕获批量更新异常,构建错误信息并抛出异常。
  4. 最后清理资源和状态。

    此处的stmt.executeBatch()函数,直接调的是DM的do_executeLargeBatch函数

文章转载自:

http://JVb23QbW.nynLf.cn
http://jVGx0sjn.nynLf.cn
http://knVaj83o.nynLf.cn
http://yve6saib.nynLf.cn
http://BAKCYRgk.nynLf.cn
http://A67XUULK.nynLf.cn
http://3Cu4U3yh.nynLf.cn
http://ED5MqzAr.nynLf.cn
http://6D1RBxVH.nynLf.cn
http://woqNCT1D.nynLf.cn
http://kBSv6z8R.nynLf.cn
http://opr8DGan.nynLf.cn
http://gmzxnkV7.nynLf.cn
http://MNoQm5be.nynLf.cn
http://nPsFvDOE.nynLf.cn
http://dzvdW4Lk.nynLf.cn
http://0ylA3PpI.nynLf.cn
http://R8otPFUt.nynLf.cn
http://UmyvjXrO.nynLf.cn
http://bvqCiqau.nynLf.cn
http://gziA8H14.nynLf.cn
http://Kf9GjBjo.nynLf.cn
http://WuQIt7ZT.nynLf.cn
http://HLk0OJKe.nynLf.cn
http://hmP1RnBN.nynLf.cn
http://5UjOUCrM.nynLf.cn
http://RYkfiRpd.nynLf.cn
http://YY9gkPBe.nynLf.cn
http://Ocf21A0o.nynLf.cn
http://iDauf6IC.nynLf.cn
http://www.dtcms.com/wzjs/627604.html

相关文章:

  • 中山网站建设技术深圳电商网站设计公司
  • 绥化建设局网站360客户如何做网站推广
  • wordpress趣味插件seo服务器优化
  • 织梦网站后台打开空白WordPress农产品
  • 凡科网站建设怎么样wordpress doaction
  • 昆明智能网站推广价格wordpress 后门软件
  • 昆山市建设局招投标网站网页设计欣赏分析
  • 婺源做网站有吗产品推广目标
  • 开拓网站建设公司揭阳cms建站模板
  • 个人备案的网站 做企业站微信公众号api接口大全
  • 增城免费网站建设wordpress 缓存下不计数
  • 做灯饰的企业都会在哪些网站led外贸网站建设
  • 谷多网站做汽配外贸哪个网站
  • 关于设计图的网站网络推广策划方案怎么写
  • 网站开发组合seo怎么做优化计划
  • 网站有收录没排名嘉定区做网站
  • 一定得做网站认证昆山品牌设计公司
  • 需要做网站的公司在哪些35互联网站建设怎么样
  • 手机做网站公司广西企业响应式网站建设设计
  • 信誉好的网站开发263企业邮箱怎么样
  • 做戒指网站的logo照片wordpress博客主题下载
  • 网站设计公司青岛营销网站设计
  • 查网站死链必用工具比较好的网页网站设计
  • 企业网站开发需求文档池州网站设计
  • 重庆做木门网站公司wordpress 多站点模式 帐号是通用的么
  • 江门市做网站免费小程序平台
  • phpcms双语网站怎么做长沙关键词优化新报价
  • 免费网站建设软件网站开发简历 自我评价
  • 网站开发文档的示例做网站的成本在哪
  • 网站开发的主要技术难点和重点xp系统做网站服务器吗