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

淮安网站建设公司北京百度seo工作室

淮安网站建设公司,北京百度seo工作室,投资管理公司注册,建设服装网站的论文文章目录引入相关资料环境准备分页查询处理#xff0c;减少单次批量处理的数据量级补充亿点点日志#xff0c;更易观察多线程优化查询_切数据版多线程_每个线程都分页处理引入 都说后端开发能顶半个运维#xff0c;我们经常需要对大量输出进行需求调整#xff0c;很多时候… 文章目录引入相关资料环境准备分页查询处理减少单次批量处理的数据量级补充亿点点日志更易观察多线程优化查询_切数据版多线程_每个线程都分页处理引入 都说后端开发能顶半个运维我们经常需要对大量输出进行需求调整很多时候sql语句已经无法吗满足我们的需求此时就需要使用我们熟悉的 java语言结合单元测试写一些脚本进行批量处理。 相关资料 案例代码获取 视频讲解 利用分页处理数据量较大的情况补充亿点点日志 环境准备 可直接使用我分享的工程 案例代码获取 我这里准备了一个10000条数据的的user表和对应的一个springboot工程: Slf4j SpringBootTest(classes MyWebDemoApplication.class,// 配置端口启动否则获取失败webEnvironment SpringBootTest.WebEnvironment.RANDOM_PORT) public class BatchDemo {Autowiredprivate UserMapper userMapper;}分页查询处理减少单次批量处理的数据量级 当我们的数据量很大并且单个对象也很大时如果一次查出所有待处理的数据往往会把我们的对象给撑爆这时我们可以利用分页的思想将数据拆分分页去处理 已知数据量总数的分页批处理模板 /*** 分页查询处理减少单次批量处理的数据量级* 当前已知数据量总数*/ Test public void test1() {// 预定义参数int page 0;int pageSize 5000;// 获取总数Integer total userMapper.selectCount(null);// 计算页数int pages total / pageSize;if (total % pageSize 0) {pages;}// 开始遍历处理数据for (; page pages; page) {ListUser users userMapper.selectList(Wrappers.UserlambdaQuery().last(String.format(LIMIT %s,%s, page * pageSize, pageSize)));users.forEach(user - {/// 进行一些数据组装操作});/// 批量 修改/插入 操作User lastUser users.get(users.size() - 1);log.info(最后一个要处理的用户的ID为{}名字{}, lastUser.getId(), lastUser.getNickName());}}上面展示的是已知数据量总数的情况有时候我们是未知总量的此时可以采用如下写法 未知数据量总数的分页批处理模板 /*** 未知总数的写法*/ Test public void test2() {// 预定义参数int page 0;int pageSize 500;// 开始遍历处理数据for (; ; ) {ListUser users userMapper.selectList(Wrappers.UserlambdaQuery().last(String.format(LIMIT %s,%s, (page) * pageSize, pageSize)));users.forEach(user - {/// 进行一些数据组装操作});/// 批量 修改/插入 操作if (CollUtil.isNotEmpty(users)) {User lastUser users.get(users.size() - 1);log.info(最后一个要处理的用户的ID为{}名字{}, lastUser.getId(), lastUser.getNickName());}if (users.size() pageSize) {break;}} }这里每次输出循环的最后一条数据帮助我们验证结果 补充亿点点日志更易观察 良好的日志输出能够帮助我们实时了解脚本的运行情况很多时候每次循环内部都会处理一个耗时操作这里用已知总数的情况添加日志如下 起始展示待处理数据总量总页数每页条数每页开始展示当前进度每页结束暂时耗时已处理条数失败数最后一条数据信息等循环内部每分钟输出一次日志处理完毕输出总耗时总条数失败数失败数据id集合等 /*** 补充亿点点日志*/ Test public void test3() {// 预定义参数int page 1;int pageSize 500;// 获取总数Integer total userMapper.selectCount(null);// 计算页数int pages total / pageSize;if (total % pageSize 0) {pages;}// 总处理条数int count 0;// 成功处理数int countOk 0;// 处理失败记录ListInteger wrongIds new ArrayList();// 已过分钟数int countMinute 1;long start System.currentTimeMillis();// 开始遍历处理数据log.info( 开始批量处理数据 );log.info(待处理条数{}, total);log.info(总页数{}, pages);log.info(每页条数{}, pageSize);for (; page pages; page) {log.info( 当前进度{}/{} , page, pages);ListUser users userMapper.selectList(Wrappers.UserlambdaQuery().last(String.format(LIMIT %s,%s, (page - 1) * pageSize, pageSize)));for (User user : users) {/// 进行一些数据组装操作if (user.getId() % 99 0) {wrongIds.add(user.getId());} else {countOk;}count;/// 模拟耗时操作try {Thread.sleep(10);} catch (InterruptedException e) {throw new RuntimeException(e);}// 每分钟输出一次日志if ((System.currentTimeMillis() - start) / 1000 / 60 countMinute) {log.info(已耗时{} s, (System.currentTimeMillis() - start) / 1000);log.info(当前总条数{}, count);log.info(处理成功数{}, countOk);log.info(处理失败数{}, wrongIds.size());log.info(当前处理用户信息{} : {}, user.getId(), user.getNickName());countMinute;}}/// 批量 修改/插入 操作log.info(已耗时{} s, (System.currentTimeMillis() - start) / 1000);log.info(当前总条数{}, count);log.info(处理成功数{}, countOk);log.info(处理失败数{}, wrongIds.size());if (CollUtil.isNotEmpty(users)) {User user users.get(users.size() - 1);log.info({} : {}, user.getNickName(), user.getId());}}log.info( 运行完毕 );log.info(总耗时{} s, (System.currentTimeMillis() - start) / 1000);log.info(总处理条数{}, count);log.info(处理成功数{}, countOk);log.info(处理失败数{}, wrongIds.size());log.info(处理失败数据id集合{}, wrongIds); }效果如下 多线程优化查询_切数据版 多核CPU才能真正意义上的并行不然就是宏观并行微观串行 o(╥﹏╥)o大家得看下自己的cpu当然如果有很多阻塞IO单核进行切换线程也是能够提高性能的 这里开5个线程将数据按线程数进行拆分代码如下 /*** 多线程优化查询【切数据版 按线程数量切割数据直接处理】* 需要程序进行大量计算* 数据库能承受较大并发* 多核CPU才能真正意义上的并行不然就是宏观并行微观串行 o(╥﹏╥)o*/ Test public void test4() {// 预定义参数int threadNum 5;long start System.currentTimeMillis();// 获取总数Integer total userMapper.selectCount(null);// 创建线程池这里为了简便操作直接用Executors创建推荐自行集成配置线程池ExecutorService executorService Executors.newFixedThreadPool(threadNum);// 设置信号标用于等待所有线程执行完CountDownLatch countDownLatch new CountDownLatch(threadNum);// 计算线程需要处理的数据量的递增步长int threadTotalStep total / threadNum;// 判断是否有余数如果有多出的数据补给最后一个线程int more total % threadNum;// 开启 threadNum 个线程处理数据for (int i 0; i threadNum; i) {int finalI i;executorService.execute(() - {int current threadTotalStep * finalI;/// 如果有余数最后一次计算得补充余数if (more 0 finalI threadNum - 1) {current more;}ListUser users userMapper.selectList(Wrappers.UserlambdaQuery().last(String.format(LIMIT %s,%s, current, threadTotalStep)));users.forEach(user - {/// 进行一些数据组装操作/// 进行一些耗时操作try {Thread.sleep(1);} catch (InterruptedException e) {throw new RuntimeException(e);}});/// 批量 修改/插入 操作User user users.get(users.size() - 1);log.info(线程-{} 处理的最后一个数据的id为{}, finalI 1, user.getId());countDownLatch.countDown();});}try {countDownLatch.await();executorService.shutdown();log.info(总耗时{} s, (System.currentTimeMillis() - start) / 1000);} catch (InterruptedException e) {throw new RuntimeException(e);} }执行结果如下 多线程_每个线程都分页处理 如果单个线程处理数据量也很大此时每个线程都可补充分页进行处理如下 /*** 多线程优化查询【分页版先按数量切数据再在每个线程中分页处理数据】* 需要程序进行大量计算* 数据库能承受较大并发* 多核CPU才能真正意义上的并行不然就是宏观并行微观串行 o(╥﹏╥)o*/ Test public void test5() {// 预定义参数int threadNum 5; // 线程数int pageSize 500; // 每页处理条数long start System.currentTimeMillis();// 获取总数Integer total userMapper.selectCount(null);// 创建线程池这里为了简便操作直接用Executors创建推荐自行集成配置线程池ExecutorService executorService Executors.newFixedThreadPool(threadNum);// 设置信号标用于等待所有线程执行完CountDownLatch countDownLatch new CountDownLatch(threadNum);// 计算线程需要处理的数据量的递增步长int threadTotalStep total / threadNum;// 判断是否有余数如果有多出的数据补给最后一个线程int more total % threadNum;// 开启 threadNum 个线程处理数据for (int i 0; i threadNum; i) {int finalI i;executorService.execute(() - {/// 数据总数就是 数据总数步长int threadTotal threadTotalStep;// 获取上一个线程最终行数int oldThreadCurrent threadTotalStep * finalI;/// 如果有余数最后一次计算得补充余数if (more 0 finalI threadNum - 1) {threadTotal more;}log.info(线程-{} 要处理的数据总数为{}, finalI 1, threadTotal);// 计算页数int pages threadTotal / pageSize;if (threadTotal % pageSize 0) {pages;}// 统计数量当等于线程总总数时退出循环避免重复计数int handleCount 0;// 获取最后一个userUser lastUser new User();// 开始遍历处理数据for (int page 0; page pages; page) {ListUser users userMapper.selectList(Wrappers.UserlambdaQuery().last(String.format(LIMIT %s,%s, page * pageSize oldThreadCurrent, pageSize)));for (User user : users) {handleCount;if (handleCount threadTotal) {break;}/// 模拟真正的逻辑处理耗时操作try {Thread.sleep(1);} catch (InterruptedException e) {throw new RuntimeException(e);}}/// 批量 修改/插入 操作if (CollUtil.isNotEmpty(users)) {lastUser users.get(users.size() - 1);}}log.info(线程-{} 处理的最后一个数据的id为{}, finalI 1, lastUser.getId());countDownLatch.countDown();});}try {countDownLatch.await();executorService.shutdown();log.info(总耗时{} s, (System.currentTimeMillis() - start) / 1000);} catch (InterruptedException e) {throw new RuntimeException(e);}}
http://www.hkea.cn/news/14332923/

相关文章:

  • 深圳网站建设主页马鞍山做公司网站的
  • 中国招标网官方网站在东莞怎么找工作
  • 网站制作 深圳有什么公司网页设计与制作课程在工作中的应用
  • 顺德手机网站设计权威开发app用什么框架
  • 山西省住房和城乡建设厅网站手机安装wordpress
  • 网站内容管理系统下载株洲seo优化报价
  • 企业建网站计什么科目建设网站前期准备工作
  • jsp网站开发技术难点中国最早的电商平台
  • 大良营销网站建设案例房屋室内设计学校
  • 做网站实例教程沈阳男科在线咨询
  • 淘宝联盟+做网站网站制作品牌有哪些
  • 微博优惠券网站怎么做做网站的请示
  • 南京高新区网站建设公司建网站要多少钱
  • 设计专业干货推荐网站wordpress+判断手机
  • 唐山建设网站设计教学网站推荐
  • 棋牌游戏网站模板下载儿童玩具网站建设实训报告
  • 做食品网站需要什么资质吗注册 网站开发 公司
  • 做标记网站三 网站开发使用软件环境
  • 做词频云图的网站网页源代码有什么用
  • 广州天美展览公司网站受欢迎的网站建设案例
  • 网站定制开发一般多久wordpress中文附件乱码
  • 艺术网站建设dede大气企业网站模板(一屏展示)
  • 网站网址模板企业手机网站建设公司
  • 网页设计最牛的网站建设wap网站开发公司
  • 宿迁网站网站建设西安短视频培训
  • 网站ftp上传工具哪个好用vps lnmp wordpress
  • 深圳企业社保网站官网黄页是什么东西
  • 大眼睛网站建设长沙模板网站长沙网站建设
  • 网站建设有必要做手机端吗外贸快车
  • 北京著名网站建设公司网站桌面图标怎么做