java使用多线程不分页查询100万条数据

news2024/10/7 20:29:24

如果用普通查询需要5分多分钟才查询完毕,所以我们用索引加多线程来实现。

那我们就开始吧!GO!!GO!!

数据库设计

编写数据库字段
然后要生成100万条数据
在这里插入图片描述
在数据库添加索引
在这里插入图片描述

代码实现

java编写
controller类编写

package com.neu.controller;
 
import com.neu.mapper.UserMapper;
import com.neu.pojo.User;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

import javax.annotation.Resource;
import java.util.*;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
 
/**
 * 用户查询多线程用户Controller
 * @author 薄荷蓝柠
 * @since 2023/6/6
 */
@Controller
public class ExecutorUtils {

   @Resource
   private UserMapper userMapper;

 
   // 一个线程最大处理数据量
   private static final int THREAD_COUNT_SIZE = 5000;



   @RequestMapping("Executor")
   public List<User> executeThreadPool() {

      //计算表总数
      Integer integer = userMapper.UserSum();

      //记录开始时间
      long start = System.currentTimeMillis();


      //new个和表总数一样长的ArrayList
      List<User> threadList=new ArrayList<>(integer);

      // 线程数,以5000条数据为一个线程,总数据大小除以5000,再加1
      int round = integer / THREAD_COUNT_SIZE + 1;

      //new一个临时储存List的Map,以线程名为k,用做list排序
      Map<Integer,ArrayList> temporaryMap = new HashMap<>(round);

      // 程序计数器
      final CountDownLatch count = new CountDownLatch(round);

      // 创建线程
      ExecutorService executor = Executors.newFixedThreadPool(round);

      // 分配数据
      for (int i = 0; i < round; i++) {
         //该线程的查询开始值
         int startLen = i * THREAD_COUNT_SIZE;
         int k = i + 1;
         executor.execute(new Runnable() {
            @Override
            public void run() {
               ArrayList<User> users = userMapper.subList(startLen);
               //把查出来的List放进临时Map
               temporaryMap.put(k,users);
               System.out.println("正在处理线程【" + k + "】的数据,数据大小为:" + users.size());
               // 计数器 -1(唤醒阻塞线程)
               count.countDown();
            }
         });
      }
      try {
         // 阻塞线程(主线程等待所有子线程 一起执行业务)
         count.await();
         //结束时间
         long end = System.currentTimeMillis();
         System.out.println("100万数据查询耗时:" + (end - start) + "ms");
         //通过循环遍历临时map,把map的值有序的放进List里
         temporaryMap.keySet().forEach(k->{
            threadList.addAll(temporaryMap.get(k));
         });
      } catch (Exception e) {
         e.printStackTrace();
      } finally {
         //清除临时map,释放内存
         temporaryMap.clear();
         // 终止线程池
         // 启动一次顺序关闭,执行以前提交的任务,但不接受新任务。若已经关闭,则调用没有其他作用。
         executor.shutdown();
      }
      //输出list的长度
      System.out.println("list长度为:"+threadList.size());
      return threadList;
   }
}

编写Mapper

package com.neu.mapper;

import java.util.ArrayList;
import java.util.List;

import org.apache.ibatis.annotations.*;

import com.neu.pojo.User;

/**
 * 用户查询多线程用户Controller
 * @author 薄荷蓝柠
 * @since 2023/6/6
 */
@Mapper
public interface UserMapper {
    
    /**
  * 检索user表的长度
  * @return 表长度
  */
 @Select("SELECT count(*) as sum FROM sysuser")
 Integer UserSum();

     /**
  * 检索user表的所有记录
  * @return 所有记录信息
  */
 @Select("select * from sysuser LIMIT #{startLen},5000")
 ArrayList<User> subList(@Param("startLen") int startLen);
}

编写完成后我们测试一波–>

在这里插入图片描述
测试结果20秒内,比之前快了好多

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/953706.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

STM32CubeMX 软件删除用户代码的问题解决

总结stm32cubeMx 会删除用户代码的问题。 自己的代码不会被删除的软件格式及配置方法。当然还需要注意一点&#xff1a;软件生成的工程不能有中文字符&#xff0c;要不然生成错误。 1、stm32cubeMx 的配置如下&#xff1a; 2、就是按照格式把自己的代码写到应该写的位置。如下图…

【Python】Python Flask token身份认证(附完整代码)

前言 Python Flask是一个使用Python编写的轻量级Web应用框架&#xff0c;它可以非常方便地搭建Web应用。在Web应用中&#xff0c;经常需要进行身份认证&#xff0c;以确保只有授权用户才能访问某些资源。本文将介绍如何使用token进行身份认证&#xff0c;以及如何在Python Fla…

IIS搭建本地电脑服务器:通过内网穿透技术实现公网访问的步骤指南

1.前言 在网上各种教程和介绍中&#xff0c;搭建网页都会借助各种软件的帮助&#xff0c;比如网页运行的Apache和Nginx、数据库软件MySQL和MSSQL之类&#xff0c;为方便用户使用&#xff0c;还出现了XAMPP、PHPStudy、宝塔面板等等一系列集成服务&#xff0c;都是为了方便我们…

20W到80W SIP音柱

SIP-7042 20W到80WSIP音柱 一、描述 SIP-7042是一款壁挂式SIP有源音柱&#xff0c;具有10/100M以太网接口&#xff0c;可将SIP音源通过自带的功放和喇叭输出播放&#xff0c;其采用铝合金防水设计&#xff0c;功率可以从20W到80W。SIP-7042作为SIP广播播放系统的终端&#xff…

一招搞定Nuxt3中配置全局样式和全局变量

// nuxt.config.ts // https://nuxt.com/docs/api/configuration/nuxt-config export default defineNuxtConfig({devtools: { enabled: true },css: [/assets/style/global.less], // 全局样式vite: {css: {preprocessorOptions: {less: {additionalData: import "/asse…

记录一次ORA-00600 [kdsgrp1]导致的large tracefile的处理过程

文章目录 1.问题描叙2 查因过程2.1 查看磁盘空间状况2.2 检查表空间增长情况2.3 检查$ORACLE_BASE相关文件2.4查看trace file内容 3.处理过程3.1数据文件检查3.2 表及索引段检查 4.结论&#xff1a; 1.问题描叙 收到check_mk告警&#xff0c;约在15:17左右硬盘空间消耗暴增 …

在Ubuntu Linux系统上安装RabbitMQ服务并解决公网远程访问问题

文章目录 前言1.安装erlang 语言2.安装rabbitMQ3. 内网穿透3.1 安装cpolar内网穿透(支持一键自动安装脚本)3.2 创建HTTP隧道 4. 公网远程连接5.固定公网TCP地址5.1 保留一个固定的公网TCP端口地址5.2 配置固定公网TCP端口地址 前言 RabbitMQ是一个在 AMQP(高级消息队列协议)基…

数据资产入表 先行者数据宝在做什么?

2023年8月21日&#xff0c;财政部印发了《企业数据资源相关会计处理暂行规定》&#xff0c;规定数据将作为资产进入企业资产负债表&#xff0c;具体是将数据确认为企业资产负债表中“资产”一项&#xff0c;在财务报表中体现其真实价值与业务贡献。入表意味着数据完成了从自然资…

ChatGPT 实现动态地图可视化展示

地图可视化分析有许多优点和好处: 1.直观理解:地图可视化使得复杂的数据更易于理解。通过地图可视化,人们可以直观地看到地理位置、地区之间的关系以及空间分布的模式。 2.提高决策效率:地图可视化可以帮助决策者快速理解和解释数据,从而提高决策效率。 3.高效的数据整…

streamlit--构建对话式应用程序

聊天元素 st.chat_message st.chat_input 构建镜像回复输入内容的机器人 使用流式传输构建简单的聊天机器人 构建一个类似ChatGPT的应用程序 参考资料 streamlit-构建对话式应用程序

iOS开发Swift-4-IBAction,group,音乐播放器-木琴App

1.使用素材创建木琴App的UI。 2.连接IBAction。 其余按钮直接拖拽到play里边。 当鼠标置于1处时2处显示如图&#xff0c;表示成功。当用户按下任一按钮都会触发play中的内容。 3.将7个按钮的View中的Tag值分别调为1、2、3、4、5、6、7. 4.将音频文件拖入项目文件中。 Create gr…

一篇文章告诉你JavaScript 如何实现继承

一、背景简介 JavaScript 在编程语言界是个特殊种类&#xff0c;它和其他编程语言很不一样&#xff0c;JavaScript 可以在运行的时候动态地改变某个变量的类型。 比如你永远也没法想到像isTimeout这样一个变量可以存在多少种类型&#xff0c;除了布尔值true和false&#xff0…

大数据平台数据脱敏是什么意思?有哪些方案?

大数据平台包含了海量多样化数据&#xff0c;所以保障大数据平台数据安全非常重要&#xff0c;数据脱敏就是手段之一。今天我们就来简单聊聊大数据平台数据脱敏是什么意思&#xff1f;有哪些方案&#xff1f; 大数据平台数据脱敏是什么意思&#xff1f; 大数据平台数据脱敏简…

Golang数据结构和算法

Golang数据结构和算法 数据的逻辑结构和物理结构常见数据结构及其特点算法的时间复杂度和空间复杂度Golang冒泡排序Golang选择排序Golang插入排序Golang快速排序Golang归并排序Golang二分查找Golang sort包Golang链表Golang container/list标准库Golang栈stackGolang二叉搜索树…

域内密码喷洒

在Kerberos阶段认证的AS-REQ阶段&#xff0c;请求包cname对应的值是用户名&#xff0c;当用户名存在时候&#xff0c;密码正确和错误两种情况下&#xff0c;AS-REP返回包不一样&#xff0c;所以可以利用这一点对域用户名进行密码喷洒攻击 域内密码喷洒工具 Kerbrute kerbrut…

62.C++ deque容器

目录 1.deque容器基本概念 2.deque与vector区别&#xff1a; 3.deque构造函数 4.deque赋值操作 5.deque大小操作 6.deque双端操作和删除 7.deque数据存取 8.deque插⼊操作 9.deque删除操作 1.deque容器基本概念 deque是⼀种双向开⼝的连续线性空间。所谓的双向开⼝&…

找不到vcruntime140.dll,无法继续执行代码。可行的解决方法分享

在日常使用电脑的过程中&#xff0c;我们可能会遇到各种问题&#xff0c;其中之一就是提示“由于找不到 VCRUNTIME140.dll&#xff0c;无法继续执行代码。重新安装程序可能会解决此问题。”&#xff0c;这一般是什么原因导致了这个问题&#xff0c;我们要如何解决&#xff1f; …

14:00面试,14:10就出来了,问的问题有点变态......

从小厂出来&#xff0c;没想到在另一家公司又寄了。 到这家公司开始上班&#xff0c;加班是每天必不可少的&#xff0c;看在钱给的比较多的份上&#xff0c;就不太计较了。没想到5月一纸通知&#xff0c;所有人不准加班&#xff0c;加班费不仅没有了&#xff0c;薪资还要降40%…

亚马逊云科技GenAI菁英创造营,致力于大模型时代高校AI人才培养

大语言模型&#xff08;LLM&#xff09;产业的蓬勃发展将改变数字产业生态&#xff0c;助力AI工业化进程、变革海量应用交互方式、创造数字产业新的增长空间。 “GenAI Talent Program”由亚马逊云科技特别打造&#xff0c;该计划致力于大模型时代高校AI人才培养&#xff0c;通…

36种水果和蔬菜识别(pytorch框架,深度卷积网络模型,可以实现照片连续识别和视频识别)

1.效果视频&#xff1a;36种水果和蔬菜识别&#xff08;pytorch框架&#xff0c;深度卷积网络模型&#xff0c;可以实现照片连续识别和视频识别&#xff09;_哔哩哔哩_bilibili 2.项目文件夹 第一个文件夹&#xff08;data&#xff09;&#xff1a; 装载的是原始图像 第二个文…