java 多线程提高大数据量的读写效率

2023-11-02

对于多线程来说,刚开始是比较蒙的,不了解其中的运行机制。
最近项目中需要用多线程解决一个加载缓慢的问题,特此写了一个例子,供大家参考,如有建议,请多指教,哈哈哈

那么,话不多说。
先说下需求:此接口供xxx公司调用,实现对数据库的读取和修改。而且是全量读取,不进行分页读取。(百万级别数据量)
那就要考虑下,如果将数据分批进行处理,看下哪里运行时间相对较长,将哪部分代码进行多线程处理。

注:程序员最重要的不是写代码,而是对问题的思考和拿出最好的解决方案,再写代码进行解决。

在此例中,将全量数据分批处理,每批5000条数据进行读取操作。
先上代码:

/**
 * 查询指定SN的IP值
 *
 * @return 结果
 */
@RequestMapping("/findIP")
@ResponseBody
public Map<String, Object> getIpFromSn(int flag) {

    Map<String, Object> map = new HashMap<String, Object>();
//      JSONObject json = null;
    try {
        //分批进行处理
        int total = this.routeInfoService.getRouteFindIPCount();
        int onet = 5000;
        int begt = 0;
        int Wtime = total / onet + 1;
        int totalCount = 1;
    	if (flag == 1) {
    		KEY_CHECK_DEAL_TYPE = "stop";
    	} else {
    		KEY_CHECK_DEAL_TYPE = "deal";
    	}
        for (int j = 1; j <= Wtime; j++) {
        	logger.info("当前的处理标识为{}"+KEY_CHECK_DEAL_TYPE);
        	if(KEY_CHECK_DEAL_TYPE.equals("deal")){
            begt = (j - 1) * onet;
            List<RouteCheckIp> infos = new ArrayList<RouteCheckIp>();
//              SimpleDateFormat begint = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
//              Date beginti = begint.parse(begint.format(new Date()));
                //查询需要新增处理的SN号码
                List<RouteInfo> SnList = this.routeInfoService.selectRouteInfoSn(begt, onet);
                // 增加线程,处理循环中的每5000条数据
                int threadNum = THREAD_NUM;
                ExecutorService executorService = Executors.newFixedThreadPool(threadNum);
                CountDownLatch countDownLatch = new CountDownLatch(threadNum);
                int perSize = SnList.size() / threadNum;
                for (int i = 0; i < threadNum; i++) {
                    MultiThread thread = new MultiThread();
                    thread.setRouteInfoList(SnList.subList(i * perSize, (i + 1) * perSize));
                    thread.setRedisReportUtil(redisReportUtil);
                    thread.setTotalCount(totalCount);
                    thread.setTotal(total);
                    thread.setRouteInfoService(routeInfoService);
                    thread.setJ(j);
                    thread.setCountDownLatch(countDownLatch);
                    executorService.submit(thread);
                }
                countDownLatch.await();
                executorService.shutdown();
                // 优化前
//                for (RouteInfo info : SnList) {
//                    String dateBySn = redisReportUtil.getString(CommonConstant.ROUTE_INFO_REPORT_REDIS_PRE + info.getRouteSn());
//                    if (!"".equals(dateBySn) && (dateBySn != null)) {
//                        RouteCheckIp rci = new RouteCheckIp();
//                        json = new JSONObject(dateBySn);
//                        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
//                        String str = json.isNull("routerIp") ? "" : json.get("routerIp").toString();
//                        int inter = 0;
//                        if(str==null || str.length()<2){
//                            inter=3;
//                        }else if (checkIp("192",str) || checkIp("10",str) || checkIp("100",str) || checkIp("172",str)) {
//                            inter = 0;
//                        }else{
//                            inter=1;
//                        }
//                        /**
//                    	 * 2018/6/27 新增redis中除去deviceList字段的所有字段
//                    	 * 开始
//                    	 */
//                        rci.setWanUpSpeed(json.isNull(
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java 多线程提高大数据量的读写效率 的相关文章

  • Java Swing BoxLayout 忽略 AlignmentX

    在下面的代码中 通过调用setAlignmentX with Component LEFT ALIGNMENT我希望在居中的滑块上获得左对齐的标签 由于某种原因 标签也居中 似乎与传递给 setAlignmentX 的值无关 我必须向 se
  • Android:java.lang.OutOfMemoryError:

    我在 Android 上开发了一个使用大量图像的应用程序 可绘制文件夹中有很多图像 比如说超过 100 张 我正在开发图像动画应用程序 我使用 imageview 来显示 GIF 图像 我使用了将 gif 图像分割成多个 PNG 格式图像的
  • 无论线程如何,对象是否总是能看到其最新的内部状态?

    假设我有一个带有简单整数计数变量的可运行对象 每次可运行对象运行时该变量都会递增 该对象的一个 实例被提交以在计划的执行程序服务中定期运行 class Counter implements Runnable private int coun
  • 在 String 值之后打印 int 值

    我有以下示例代码 int pay 80 int bonus 65 System out println pay bonus bonus pay 有人可以向我解释一下为什么我得到以下输出 145 6580 您的代码正在从左到右解释表达式 pa
  • 简单 XML 框架:ElementMap 中的对象具有“类似内联”的行为

    我正在尝试在 Android 上序列化自定义对象的 Hashmap 以获得如下 xml
  • 了解 netty 通道缓冲区和水印

    我正在尝试了解网络缓冲区和水印 作为一个测试用例 我有一个 netty 服务器 它向客户端写入数据 客户端被阻止 基本上每次读取之间有 10 秒的睡眠时间 在正常 I O 下 如果接收方被阻塞 TCP 发送方将受到限制 由于流量控制 发送速
  • 类型已知,但方法指的是缺失类型

    我对 java 和 Eclipse 不太有经验 但遇到以下问题 我正在写类似的东西 Point3D myPoint myClass myMethod arg 我收到错误 方法 myMethod myType arg 引用缺失的类型 Poin
  • 如何从 Java 访问 Windows 设备管理器中的信息?

    我有一个串行 USB 设备 并且其中多个设备可以连接到计算机 我需要查询和检索设备连接到的 COM 端口列表 在 Windows 设备管理器中 您可以获得当前连接的设备的 COM 端口 友好名称 该列表是动态的 从注册表中读取不工作 htt
  • 如何准确判断 double 是否为整数? [复制]

    这个问题在这里已经有答案了 具体来说 在 Java 中 我如何确定double是一个整数 为了澄清 我想知道如何确定 double 实际上不包含任何分数或小数 我主要关心的是浮点数的性质 我想到的方法 以及我通过谷歌找到的方法 基本上遵循以
  • 绘制平滑曲线

    我想创建更平滑的曲线 而不仅仅是线角 这是我现在画的图 这是我的代码 case FREEHAND float pts float ptk ptk new float 2 imageMatrix invert inv if mCurrentS
  • for循环中更新JLabel的问题

    我的程序的想法是从之前在其他 JFrame 中保存的列表中选择一个名称 我想在标签中一个接一个地打印所有名称 它们之间有很小的延迟 然后停在其中一个名称上 问题是lbl setText String 如果有多个则不起作用setText co
  • 如何让“循环”泛型在 Java 中工作?

    我在编译以下涉及一些泛型的代码时遇到错误 public abstract class State
  • 避免 @Secured 注释的重复值

    我正在尝试使用以下方法来保护我的服务方法 Secured如下 public interface IUserService Secured ROLE ROLE1 ROLE ROLE2 ResponseEntity saveUser Creat
  • 在Java中如何将字节数组转换为十六进制?

    我有一个字节数组 我希望该数组的每个字节字符串转换为其相应的十六进制值 Java中有没有将字节数组转换为十六进制的函数 byte bytes 1 0 1 2 3 StringBuilder sb new StringBuilder for
  • java中如何重新初始化int数组

    class PassingRefByVal static void Change int pArray pArray 0 888 This change affects the original element pArray new int
  • JPA Web 应用程序管理策略

    我们目前正在开发一个 J2EE Web 应用程序 使用 JPA 作为我们的数据访问层 我们目前正在研究几种不同的策略来在我们的应用程序中利用缓存 Create an EntityManager per request 在请求范围内获取缓存
  • Janusgraph 0.3.2 + HBase 1.4.9 - 无法设置 graph.timestamps

    我在 Docker 容器中运行 Janusgraph 0 3 2 并尝试使用运行 HBase 1 4 9 的 AWS EMR 集群作为存储后端 我可以运行 gremlin server sh 但如果我尝试保存某些内容 我会得到粘贴在下面的堆
  • 检查按钮是否可用?如果没有,请等待 5 秒钟,然后再次检查?

    基本上我想看看此刻是否可以单击按钮 如果没有我想再试一次 所以我需要某种 goto 函数来返回到代码的前一行 尽管我怀疑我写得非常糟糕 但它本来可以做得更容易 try driver findElement By xpath button i
  • 从 InputStream 中删除换行符

    我喜欢从一个文件中删除所有换行符 对于 n 和 r n java io InputStream 在读取文件时 相应的方法如下所示 param target linkplain File return linkplain InputStrea
  • 如何在J2ME中获取数字的幂[重复]

    这个问题在这里已经有答案了 可能的重复 J2ME power double double 数学函数实现 https stackoverflow com questions 2076913 j2me powerdouble double ma

随机推荐

  • Hive常用DDL操作

    一 Database 1 1 查看数据列表 show databases 1 2 使用数据库 USE database name 1 3 新建数据库 语法 CREATE DATABASE SCHEMA IF NOT EXISTS datab
  • 企业微信跳转小程序注意事项

    1 引用weixin 1 2 0 js 一定使用线上引用 npm install引用的报agentConfig is not a function 2 vue ts在public gt index 中引用 lt scri pt src ht
  • [爬虫] B站番剧信息爬取

    申明 本文对爬取的数据仅做学习使用 不涉及任何商业活动 侵删 简述 本次爬取目标是 番剧的基本信息 名字 类型 集数 连载or完结 链接等 番剧的参数信息 播放量 点赞 投币 追番人数等 时间信息 开播时间 完结时间 前提条件 编程语言 P
  • 【正点原子STM32连载】 第二十八章 低功耗实验 摘自【正点原子】APM32F407最小系统板使用指南

    1 实验平台 正点原子stm32f103战舰开发板V4 2 平台购买地址 https detail tmall com item htm id 609294757420 3 全套实验源码 手册 视频下载地址 http www openedv
  • 链路追踪zipkin

    目录 链路追踪介绍 zipkin整合mysql和mq 链路追踪介绍 链路追踪主要用于分布式系统 服务出现级联调用 能够提供调用的时间且能结算出网络延迟时间 gt 将服务还原成链路 链路数据模型有三个点 Trace 一个完整的链路 用的是我们
  • 不习惯的Vue3起步 の 一:<script setup>

    序 Vue3虽然说是Vue2的升级版 但里面不一样的地方还是挺多的 并且相比Vue2能更好的使用typescript了 先从网上找视频学习 https www bilibili com video BV1gf4y1W783 目录 Vue T
  • Elasticsearch实战(八)--- 词条为中心的 CrossFields 多字段搜索策略

    Elasticsearch实战 词条为中心的Cross Fields 搜索策略 文章目录 Elasticsearch实战 词条为中心的Cross Fields 搜索策略 1 字段中心实现方式及问题 1 1 准备数据 1 2 字段中心的Mos
  • [SQL系列] 从头开始学PostgreSQL 自增 权限和时间

    SQL系列 从头开始学PostgreSQL 事务 锁 子查询 Edward W的博客 CSDN博客https blog csdn net u013379032 article details 131841058上一篇介绍了事务 锁 子查询
  • Linux操作系统之基础命令

    文章目录 一 初识LInux操作系统 Linux操作系统和Windows操作系统的区别 Linux 分为内核版本和发行版本 目录结构命令 二 常用命令 1 ls命令 查看路径下所存在的文件 2 cd命令 切换路径 3 clear 清屏命令
  • 网络工程师工作经验分享

    网络 点击打开链接1 点击打开链接2 点击打开链接3 点击打开链接
  • Docker容器-cgroups资源配置

    目录 Cgroup的概述 使用stress工具测试CPU和内存 CPU周期限制 CPU Core控制 对内存限额 对 Block IO的限制 bps 和iops 的限制 Cgroups如何工作的 cgroup对cpu限制小结 cgroup对
  • 【其他】MacOS Homebrew安装与卸载

    打开terminal 输入 usr bin ruby e curl fsSL https raw githubusercontent com Homebrew install master install 输入sudo密码之后等待一会 之后
  • 电子拼图思维逻辑机的破解思路

    最近孩子去朋友家做客 喜欢上了一个玩具 网上找了好久都没找到 后来问朋友给了个链接 发现是上市不久的益智类游戏玩具 先上个图 开机之后有500关 难度越来越大 在朋友家玩的第3关 小孩子们都拼不上 然后我们家长大孩子们也一起参与 搞了几分钟
  • 前端使用FormData实现上传文件

    场景 用户通过点击图片弹出上传文件的框框 然后选择将要替换的图片 选择后实时预览 点击确定后通过ajax上传到服务器 前端html div div
  • 面试官都在问

    面试官都在问 Linux命令之gdb 0 简述 GDB GNU symbolic debugger 简单地说就是一个调试工具 它是一个受通用公共许可证即GPL保护的自由软件 一般来说 GDB主要帮助你完成下面四个方面的功能 1 启动你的程序
  • Python数据可视化

    Python数据可视化 Python地理区域发展分布热力图 目录 Python数据可视化 Python地理区域发展分布热力图 基本介绍 环境准备 程序设计 参考资料 基本介绍 Python数据可视化 Python地理区域发展分布热力图 环境
  • qtxml生成与解析

    目录 xml生成 xml解析 xml生成 void Qxml setTml QDomDocument doc xml文档树的创建 xml文档树的指令版本必有的 QDomProcessingInstruction pi doc createP
  • LINUX安装nginx详细步骤,部署web前端项目

    1 安装依赖包 一键安装上面四个依赖 yum y install gcc zlib zlib devel pcre devel openssl openssl devel 2 下载并解压安装包 可以去https nginx org down
  • 华为OD机试真题- 跳房子I-2023年OD统一考试(B卷)

    题目描述 跳房子 也叫跳飞机 是一种世界性的儿童游戏 游戏参与者需要分多个回合按顺序跳到第1格直到房子的最后一格 跳房子的过程中 可以向前跳 也可以向后跳 假设房子的总格数是count 小红每回合可能连续跳的步数都放在数组steps中 请问
  • java 多线程提高大数据量的读写效率

    对于多线程来说 刚开始是比较蒙的 不了解其中的运行机制 最近项目中需要用多线程解决一个加载缓慢的问题 特此写了一个例子 供大家参考 如有建议 请多指教 哈哈哈 那么 话不多说 先说下需求 此接口供xxx公司调用 实现对数据库的读取和修改 而