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

哪个网站做布料好搜索引擎推广实训

哪个网站做布料好,搜索引擎推广实训,wordpress点击阅读全部,视频网站开发用什么服务器背景:需要实现批量插入并且得到插入后的ID。 使用for循环进行insert这里就不说了,在海量数据下其性能是最慢的。数据量小的情况下,没什么区别。 【1】saveBatch(一万条数据总耗时:2478ms) mybatisplus扩展包提供的:…

背景:需要实现批量插入并且得到插入后的ID。

使用for循环进行insert这里就不说了,在海量数据下其性能是最慢的。数据量小的情况下,没什么区别。

【1】saveBatch(一万条数据总耗时:2478ms)

mybatisplus扩展包提供的:com.baomidou.mybatisplus.extension.service.IService#saveBatch(java.util.Collection<T>)

测试代码:

@Testpublic void testBatch1(){List<SysFile> list=new ArrayList<>();list.add(new SysFile().setFileName("fiel1"));list.add(new SysFile().setFileName("fiel2"));list.add(new SysFile().setFileName("fiel3"));list.add(new SysFile().setFileName("fiel4"));list.add(new SysFile().setFileName("fiel5"));list.add(new SysFile().setFileName("fiel6"));fileService.saveBatch(list);System.out.println(list);}

我们分析其实现原理如下:com.baomidou.mybatisplus.extension.service.impl.ServiceImpl#saveBatch

@Transactional(rollbackFor = Exception.class)
@Override
public boolean saveBatch(Collection<T> entityList, int batchSize) {String sqlStatement = sqlStatement(SqlMethod.INSERT_ONE);int size = entityList.size();executeBatch(sqlSession -> {int i = 1;for (T entity : entityList) {sqlSession.insert(sqlStatement, entity);if ((i % batchSize == 0) || i == size) {sqlSession.flushStatements();}i++;}});return true;
}

其实也就是一条条插入。

在这里插入图片描述

【2】集合方式foreach(一万条数据总耗时:474ms)

SysFileMapper 自定义方法batchSaveFiles

public interface SysFileMapper extends BaseMapper<SysFile> {int batchSaveFiles(List<SysFile> entityList);
}

xml实现

<insert id="batchSaveFiles">insert  into tb_sys_file (file_name) values<foreach collection="list" item="item" separator=",">(#{item.fileName})</foreach>
</insert>

测试代码:

@Test
public void testBatch2(){List<SysFile> list=new ArrayList<>();list.add(new SysFile().setFileName("fiel1"));list.add(new SysFile().setFileName("fiel2"));list.add(new SysFile().setFileName("fiel3"));list.add(new SysFile().setFileName("fiel4"));list.add(new SysFile().setFileName("fiel5"));list.add(new SysFile().setFileName("fiel6"));fileMapper.batchSaveFiles(list);System.out.println(list);
}

测试结果:
在这里插入图片描述
注意:这种方式得不到ID哦!

【3】MyBatis-Plus提供的InsertBatchSomeColumn方法(一万条数据总耗时:690ms)

这里mybatisplus版本是3.3.0。

编写MySqlInjector

public class MySqlInjector extends DefaultSqlInjector {@Overridepublic List<AbstractMethod> getMethodList(Class<?> mapperClass) {List<AbstractMethod> methodList = super.getMethodList(mapperClass);//更新时自动填充的字段,不用插入值methodList.add(new InsertBatchSomeColumn(i -> i.getFieldFill() != FieldFill.UPDATE));return methodList;}
}

注入到配置类

@EnableTransactionManagement
@MapperScan({"com.enodeb.mapper"})
@Configuration
public class MybatisPlusConfig {@Beanpublic MySqlInjector sqlInjector() {return new MySqlInjector();}
}    

SysFileMapper 自定义方法

public interface SysFileMapper extends BaseMapper<SysFile> {int insertBatchSomeColumn(List<SysFile> entityList);

测试代码:

@Test
public void testBatch3(){List<SysFile> list=new ArrayList<>();list.add(new SysFile().setFileName("fiel1"));list.add(new SysFile().setFileName("fiel2"));list.add(new SysFile().setFileName("fiel3"));list.add(new SysFile().setFileName("fiel4"));list.add(new SysFile().setFileName("fiel5"));list.add(new SysFile().setFileName("fiel6"));fileMapper.insertBatchSomeColumn(list);System.out.println(list);
}

测试结果

在这里插入图片描述
这里不仅实现了【2】的效果,还可以得到插入后的ID。

【4】假设一万条/十万条数据的情况下,执行时间是多少

策略一万条十万条
方式一2478ms20745ms
方式二474ms2904ms
方式三690ms8339ms

① 方式一

@Testpublic void testBatch1(){long start=System.currentTimeMillis();List<SysFile> list=new ArrayList<>();SysFile sysFile;for(int i=0;i<10000;i++){sysFile=new SysFile();sysFile.setFileName("file"+i);list.add(sysFile);}fileService.saveBatch(list);long end=System.currentTimeMillis();System.out.println("一万条数据总耗时:"+(end-start)+"ms");}

一万条数据总耗时:2478ms
十万条数据总耗时:20745ms

② 方式二

@Test
public void testBatch2(){long start=System.currentTimeMillis();List<SysFile> list=new ArrayList<>();SysFile sysFile;for(int i=0;i<10000;i++){sysFile=new SysFile();sysFile.setFileName("file"+i);list.add(sysFile);}fileMapper.batchSaveFiles(list);long end=System.currentTimeMillis();System.out.println("一万条数据总耗时:"+(end-start)+"ms");}

一万条数据总耗时:474ms
十万条数据总耗时:2904ms

③ 方式三

@Test
public void testBatch3(){long start=System.currentTimeMillis();List<SysFile> list=new ArrayList<>();SysFile sysFile;for(int i=0;i<10000;i++){sysFile=new SysFile();sysFile.setFileName("file"+i);list.add(sysFile);}fileMapper.insertBatchSomeColumn(list);long end=System.currentTimeMillis();System.out.println("一万条数据总耗时:"+(end-start)+"ms");
}

一万条数据总耗时:690ms
十万条数据总耗时:8339ms

【5】百万条数据的情况下进行优化

方式二、方式三都是拼接为一条SQL,也就说有多少直接全部一次性插入,这就可能会导致最后的 sql 拼接语句特别长,超出了mysql 的限制。

这是什么意思呢?以MySQL为例,我们是需要考虑 max_allowed_packet 这个属性配置大小。其决定了你最大可以单次发送包的大小,这里可以修改为64M也就是 67108864。

但是这个不是最优解,最优解应该是控制每次插入的数量,比如一万条插入一次。

    @Testpublic void testBatch4(){List<SysFile> list=new ArrayList<>();SysFile sysFile;for(int i=0;i<100000;i++){sysFile=new SysFile();sysFile.setFileName("file"+i);list.add(sysFile);}//设置每批次插入多少条数据int batchSize=10000;int count = (list.size() + batchSize - 1) / batchSize; // 计算总批次数量,确保最后一个批次也能处理//保存单批提交的数据集合List<SysFile> oneBatchList = new ArrayList<>(batchSize); // 预分配容量for (int i = 0; i < count; i++) {int startIndex = i * batchSize;int endIndex = Math.min(startIndex + batchSize, list.size());oneBatchList.addAll(list.subList(startIndex, endIndex));fileMapper.insertBatchSomeColumn(oneBatchList);oneBatchList.clear(); // 清空集合以备下次循环使用}}

【TIPS】

为了确保批量插入的高效性,还需要进行一些配置和优化。例如,在application.yml中配置数据库连接时,可以开启MySQL的批处理模式【rewriteBatchedStatements=true】:

spring:datasource:url: jdbc:mysql://127.0.0.1:3306/testBtach?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&rewriteBatchedStatements=trueusername: rootpassword: 123456driver-class-name: com.mysql.cj.jdbc.Driver

此外还可以考虑使用jdbcTemplate.batchUpdate、Spring Batch来实现(这两种未测试)。

http://www.hkea.cn/news/408700/

相关文章:

  • 珠海建设局网站十大经典事件营销案例分析
  • 创建网站开发公司互联网推广引流是做什么的
  • 万盛集团网站建设seo网站推广全程实例
  • 做教育的网站需要资质吗网站怎么开发
  • 微网站怎么做滚动中国万网域名注册官网
  • 个人如何免费建网站seo在线优化工具 si
  • 双线主机可以做彩票网站吗网络推广合作协议
  • 做外贸的b2b网站域名批量查询系统
  • 建设网站需要哪些职位网站建设策划书
  • 苏州网站建设哪里好网站点击排名优化
  • 网站建设收费标准策划百度推广关键词越多越好吗
  • 网站怎么做更新吗如何建立网页
  • 国外建设工程招聘信息网站tool站长工具
  • 专业做相册书的网站电商网站建设制作
  • 银川网站开发公司电话东莞网
  • 环境保护局网站管理制度建设百度指数的主要功能有
  • 安装wordpress提示500错误关键词优化的策略有哪些
  • 企业网站建设公司排名深圳高端seo公司助力企业
  • 做网站套餐网站seo
  • 网站上的代码网页怎么做的下载百度软件
  • 网站功能模块建设搜狗推广
  • 网站做推广有用吗网站页面设计
  • 做简报的网站广州搜发网络科技有限公司
  • 南乐县住房和城乡建设局网站制作网站的步骤是什么
  • 金华做网站最专业的公司搜易网提供的技术服务
  • wordpress适合门户网站吗怎么营销自己的产品
  • 常用的网站类型有哪些seo优化专员编辑
  • 网站专题框架怎么做海阳seo排名
  • 手机网站代码下载黄页网站推广服务
  • 做网站前端多少钱在线bt种子