Java面试——场景题
1.如何分批处理数据?
1.使用LIMIT和OFFSET子句: 这是最常用的分批查询方法。例如,你可以使用以下SQL语句来分批查询数据:
SELECT * FROM your_table LIMIT 1000 OFFSET 0;
分批查询到的数据在后端进行处理,达到分批处理数据的效果。
2.使用多线程的方式: 如果你需要用多线程分批处理数据,并且数据所在表的主键id是递增的,可以使用取模的方式进行分批查询。例如:
import java.sql.*;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CompletableFuture;public class DatabaseUtils {// 数据库连接信息private static final String URL = "jdbc:mysql://localhost:3306/your_database";private static final String USER = "your_username";private static final String PASSWORD = "your_password";// 获取数据库连接public static Connection getConnection() throws SQLException {return DriverManager.getConnection(URL, USER, PASSWORD);}// 异步查询数据库的方法//第一个参数表示偏移量,表示当前已经查询到的数据id//第二个参数表示从当前偏移量开始,查询多少条数据public static CompletableFuture<List<String>> queryBatchAsync(int offset, int limit) {// 使用CompletableFuture.supplyAsync来异步执行数据库查询return CompletableFuture.supplyAsync(() -> {List<String> results = new ArrayList<>();try (Connection conn = getConnection();PreparedStatement stmt = conn.prepareStatement("SELECT id, data FROM your_table LIMIT ? OFFSET ?")) {// 设置查询的LIMIT和OFFSETstmt.setInt(1, limit);stmt.setInt(2, offset);// 执行查询try (ResultSet rs = stmt.executeQuery()) {// 遍历结果集,将结果添加到列表中while (rs.next()) {results.add(rs.getString("id") + ": " + rs.getString("data"));}}} catch (SQLException e) {// 如果发生异常,抛出运行时异常throw new RuntimeException(e);}// 返回查询结果return results;});}
}
这个类只是负责连接数据库,以及一个异步查询数据库的方法。注意这个方法的返回结果是CompletableFuture<List<String>>,返回一个异步任务,异步任务中的返回结果是根据偏移量和批量查询条数的查询结果,封装成一个list集合。注意数据库中的id应该是自增的
import java.util.List;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;public class MultiThreadedBatchProcessing {public static void main(String[] args) {// 假设我们有1000条记录需要处理,每批处理100条记录int totalRecords = 1000;int batchSize = 100;// 创建一个有10个线程的线程池ExecutorService executor = Executors.newFixedThreadPool(10);// 创建一个CompletableFuture数组来存储每个批次的异步任务CompletableFuture<?>[] futures = new CompletableFuture[10];// 循环创建并启动每个批次的异步查询任务for (int i = 0; i < totalRecords; i += batchSize) {int offset = i; // 计算当前批次的起始位置int limit = batchSize; // 每批处理的记录数// 启动异步查询任务futures[i / batchSize] = DatabaseUtils.queryBatchAsync(offset, limit).thenAccept(batchResult -> {// 处理每个批次的结果for (String record : batchResult) {System.out.println(record);}});}// 使用CompletableFuture.allOf等待所有批次的任务完成CompletableFuture.allOf(futures).thenRun(() -> {// 所有批次处理完成后,关闭线程池System.out.println("All batches have been processed.");executor.shutdown();}).exceptionally(e -> {// 如果发生异常,打印错误信息,并尝试紧急关闭线程池System.err.println("An error occurred: " + e.getMessage());executor.shutdownNow();return null;});}
}
追问:若多线程分批查询过程中有数据插入或者删除,则数据缺漏,如何解决问题?
使用事务保证数据一致性: 可以通过事务来确保数据的一致性。在事务中执行查询、插入或删除操作,如果中途发生错误,可以通过回滚操作来撤销所有已执行的步骤,确保数据的完整性。这样可以避免因并发操作导致的数据不一致问题。
追问:多线程共享事务存在问题,不合适,有其他方式吗?
- 消息队列和异步重试:在执行更新数据库和删除缓存的操作时,可以使用消息队列和异步重试机制。这样,即使某个操作失败,也可以通过消息队列进行补偿操作,确保数据的最终一致性。
分布式锁:在高并发场景下,可以使用分布式锁来保证同一时间只有一个线程能修改特定的数据行。这可以通过在应用程序层面采用分布式锁、Redis等中间件实现锁机制来完成
相关文章:
Java面试——场景题
1.如何分批处理数据? 1.使用LIMIT和OFFSET子句: 这是最常用的分批查询方法。例如,你可以使用以下SQL语句来分批查询数据: SELECT * FROM your_table LIMIT 1000 OFFSET 0; 分批查询到的数据在后端进行处理,达到分批…...
xss-labs靶场第一关测试报告
目录 一、测试环境 1、系统环境 2、使用工具/软件 二、测试目的 三、操作过程 1、注入点寻找 2、使用hackbar进行payload测试 3、绕过结果 四、源代码分析 五、结论 一、测试环境 1、系统环境 渗透机:本机(127.0.0.1) 靶 机:本机(127.0.0.…...
微软PowerBI认证!数据分析师入门级证书备考攻略来啦
#微软PowerBI认证!数据分析师入门级证书! 😃Power BI是一种强大的数据可视化和分析工具,学习Power BI,能提高数据的分析能力,将数据转化为有意义的见解,并支持数据驱动的决策制定。 ㅤ ✨微软P…...
上海AI Lab视频生成大模型书生.筑梦环境搭建推理测试
引子 最近视频生成大模型层出不穷,上海AI Lab推出新一代视频生成大模型 “书生・筑梦 2.0”(Vchitect 2.0)。根据官方介绍,书生・筑梦 2.0 是集文生视频、图生视频、插帧超分、训练系统一体化的视频生成大模型。OK,那就让我们开始吧。 一、模…...
3D看车如何实现?有哪些功能特点和优势?
3D看车是一种创新的汽车展示方式,它利用三维建模和虚拟现实技术,将汽车以更真实、更立体的形式呈现在消费者面前。 一、3D看车的实现方式 1、三维建模: 通过三维建模技术,按照1:1的比例还原汽车外观,包括车身线条、细…...
Pytorch中不会自动传播梯度的操作有哪些?
在 PyTorch 中,某些生成张量的操作本身不会创建与计算图相关联的梯度信息。这些操作通常用于初始化张量,并且默认情况下不需要进行梯度计算。以下是一些常见的不会自动传播梯度的张量生成操作: 数值初始化操作: torch.linspace():…...
【设计模式】软件设计原则——开闭原则里氏替换单一职责
开闭原则内容引出 开闭原则 定义:一个软件实体,类,函数,模块;对扩展开放,对修改关闭。用抽象构建框架,用实现扩展细节。可以提高软件的可复用性和可维护性。 开发新功能时,尽量不修…...
项目完整开发的流程
流程 1.设计产品 2.写需求文档 2.1需求分析,后端设计数据库,建表,客户沟通,说完签字,留证据,防止后面扯皮,和防止后续变需求重新写业务 3.画原型图,也就是草图,初始的…...
性能测试学习6:jmeter安装与基本配置/元件/线程组介绍
一.JDK安装 官网:https://www.oracle.com/ 二.Jmeter安装 官网:http://jmeter.apache.org/download_jmeter.cgi 下载zip包,zip后缀那个才是Windows系统的jmeter 三.Jmeter工作目录介绍 四.Jmeter功能 1)修改默认配置-汉化 2&am…...
大数据ETL数据提取转换和加载处理
什么是 ETL? 提取转换加载(英语:Extract, transform, load,简称ETL),用来描述将资料从来源端经过抽取、转置、加载至目的端的过程。ETL一词较常用在数据仓库,但其对象并不限于数据仓库。 ETL&…...
物理与环境安全技术
目录 物理安全 环境安全 物理安全 物理安全是指通过实施一系列的防护措施,以保护人员、设备、设施和信息资源免受物理上的威胁、损坏或非法入侵。 访问控制:限制对数据中心、机房等关键设施的物理访问。通常采用的措施有门禁系统(使用门禁…...
手把手教你如何配置好VS Code的WEB基础开发环境(保姆级)
1. VS Code介绍 微软旗下的多场景开发环境软件,支持JAVA、C、C#、C、WEB、VUE、CSS、HTML、Python等等等 如果你刚刚开始编程或者准备学习WEB,那么我强烈建议你使用这款软件 缺点:(针对初学者) 需要安装各种各样的插…...
高性能、编译器编写语言、编程语言的高低贵贱
高性能 高性能是一个通用名词,可在服务器、客户端甚至浏览器实现高性能。对于大型网站、服务器后端、游戏后端,高性能是一个不可绕过的槛。 高性能技术 池机制 静态分配:就像编译型语言对代码的预处理,不像解释型语言动态解析。可…...
Python安装库时使用国内源pip install -i
普通 安装方式会从国外站点下载, 首先是慢,再有可能会下载失败 所以一般指定国内源 示例 正常情况下,安装pandas这个模块 pip install pandas指定源命令如下: pip install -i https://pypi.tuna.tsinghua.edu.cn/simple/ pan…...
Linux 再入门整理:详解 /etc/fstab 文件
目录 1. 什么是 /etc/fstab2. /etc/fstab 文件的格式2.1 设备文件 (Device)2.2 挂载点 (Mount Point)2.3 文件系统类型 (File System Type)2.4 挂载选项 (Mount Options)2.5 Backup Operation(dump 参数)2.6 Pass Order (fsck 参数)2.6.1 参数设置2.6.2 …...
2.8 双绞线、同轴电缆、光纤与无线传输介质
传输介质及分类 传输介质也称为传输媒体,它是发送设备和接收设备之间的物理通路。 传输介质可分为导向传输介质和非导向传输介质。在导向传输介质中,电磁波被导向沿着固体媒介(铜线或光纤)传播,而非导向传输介质可以…...
OBOO鸥柏:布局于为无人机展厅行产业提供LCD液晶显示终端
新华网快讯,于10月9日消息,有投资者在互动平台向OBOO鸥柏公司提问:您好!目前有哪些工业/商用显示产品应用于无人机展厅展馆场景?能否着重介绍下贵司屏幕主要应用哪些品牌无人机数字化展厅展馆做保障? 鸥柏…...
win10状态栏中 “音量” 符号丢失,而在“打开或关闭系统图标”中音量开关无法调节的解决方法
最近在使用电脑需要调节音量时,突然发现电脑右下角的音量图标不见了,在网上搜索了,测试了许多种方法,都没有解决这个问题。 后面想想,使用其他途径,或许可以解决了我的这个问题,终于功夫不负有心…...
Mysql 学习——项目实战
MySQL 学习——项目实战 项目出处 博主:Asmywishi Linux-Ubuntu启动Mysql sudo mysqlData preparation Create Database and Table Create database : create database mysql_example1;Start database : use mysql_example1;Create Student table : # 学生表…...
Springboot 整合 logback 日志框架
文章目录 整合 Logback 日志框架第一步:导入依赖第二步:导入配置(logback.xml)详解 使用(记录日志) 遇到问题一解决方案 整合 Logback 日志框架 第一步:导入依赖 (Springboot 会自己…...
Axios遭供应链投毒攻击(附排查与紧急补救指南)
每周下载3亿次的Axios遭供应链投毒攻击,附排查与修复指南 事件概述 2026 年 3 月 31 日,著名云安全平台 StepSecurity 监测到,在 JavaScript 生态系统中最受欢迎的 HTTP 客户端库 Axios(每周下载量超 3 亿次)遭遇了严重…...
ISOLAR-B系统配置实战:如何将DBC文件信号正确映射到SWC Port(CAN网络示例)
ISOLAR-B系统配置实战:DBC信号与SWC Port的精准映射指南 当你在AUTOSAR开发中完成应用层SWC设计后,最令人头疼的莫过于如何让这些精心设计的组件与真实的ECU网络信号"对话"。ISOLAR-B作为BSW配置的核心工具,其系统级配置能力直接决…...
三步轻松获取国家中小学智慧教育平台电子课本PDF:高效教学资源下载指南
三步轻松获取国家中小学智慧教育平台电子课本PDF:高效教学资源下载指南 【免费下载链接】tchMaterial-parser 国家中小学智慧教育平台 电子课本下载工具,帮助您从智慧教育平台中获取电子课本的 PDF 文件网址并进行下载,让您更方便地获取课本内…...
Qwen3.5-9B开源可部署实践:国产昇腾910B适配方案(CANN+PyTorch NPU移植)
Qwen3.5-9B开源可部署实践:国产昇腾910B适配方案(CANNPyTorch NPU移植) 1. 项目概述 Qwen3.5-9B是一款拥有90亿参数的开源大语言模型,具备强大的逻辑推理、代码生成和多轮对话能力。该模型特别针对国产昇腾910B处理器进行了优化…...
Windows任务栏美化完全指南:打造个性化桌面体验
Windows任务栏美化完全指南:打造个性化桌面体验 【免费下载链接】TranslucentTB A lightweight utility that makes the Windows taskbar translucent/transparent. 项目地址: https://gitcode.com/gh_mirrors/tr/TranslucentTB Windows任务栏美化是许多用户…...
Buzz:离线环境下音频转录与翻译的完整解决方案
Buzz:离线环境下音频转录与翻译的完整解决方案 【免费下载链接】buzz Buzz transcribes and translates audio offline on your personal computer. Powered by OpenAIs Whisper. 项目地址: https://gitcode.com/GitHub_Trending/buz/buzz 在当今信息驱动的工…...
终极指南:如何快速完成语雀文档批量导出与迁移
终极指南:如何快速完成语雀文档批量导出与迁移 【免费下载链接】yuque-exporter export yuque to local markdown 项目地址: https://gitcode.com/gh_mirrors/yuq/yuque-exporter 在当今数字化创作时代,语雀文档批量导出已成为许多创作者和团队的…...
高效大麦抢票自动化工具实战指南:开源项目的专业配置教程
高效大麦抢票自动化工具实战指南:开源项目的专业配置教程 【免费下载链接】ticket-purchase 大麦自动抢票,支持人员、城市、日期场次、价格选择 项目地址: https://gitcode.com/GitHub_Trending/ti/ticket-purchase 大麦网作为国内领先的演出票务…...
避坑指南:在华为Atlas 200DK A2上部署YOLOv8-pose模型前,如何用ONNX Runtime在CPU/GPU上验证推理流程
边缘部署前的关键验证:YOLOv8-pose模型在CPU/GPU环境下的ONNX Runtime推理实战 在AI模型边缘部署的实践中,一个经常被忽视却至关重要的环节是本地验证。许多工程师在将模型部署到华为Atlas 200DK A2等边缘设备时,常常跳过这一步骤直接进入板端…...
Java应用等保三级合规改造:3天完成代码层、配置层、运维层全栈优化(附Checklist)
第一章:Java应用等保三级合规改造全景图等保三级是国家网络安全等级保护制度中面向重要信息系统的核心要求,对Java应用而言,合规改造不是单一技术点的修补,而是一套覆盖开发、运行、运维全生命周期的安全治理工程。其核心目标在于…...
