Java面试——场景题

news2024/10/9 19:15:39

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和OFFSET
                stmt.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;
        });
    }
}

追问:若多线程分批查询过程中有数据插入或者删除,则数据缺漏,如何解决问题?


        使用事务保证数据一致性: 可以通过事务来确保数据的一致性。在事务中执行查询、插入或删除操作,如果中途发生错误,可以通过回滚操作来撤销所有已执行的步骤,确保数据的完整性。这样可以避免因并发操作导致的数据不一致问题。


追问:多线程共享事务存在问题,不合适,有其他方式吗?

  1. 消息队列和异步重试:在执行更新数据库和删除缓存的操作时,可以使用消息队列和异步重试机制。这样,即使某个操作失败,也可以通过消息队列进行补偿操作,确保数据的最终一致性。
  2. 分布式锁:在高并发场景下,可以使用分布式锁来保证同一时间只有一个线程能修改特定的数据行。这可以通过在应用程序层面采用分布式锁、Redis等中间件实现锁机制来完成

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

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

相关文章

开源计算器应用的全面测试计划:确保功能性和可靠性

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…

Navicat图形化设置字段unique

点击索引&#xff0c;选择字段和索引类型即可。

前端学习笔记-JS进阶篇-04

1、深浅拷贝 开发中经常需要复制一个对象。如果直接用赋值会有下面问题&#xff1a; 首先浅拷贝和深拷贝只针对引用类型 1.1、浅拷贝 浅拷贝&#xff1a;拷贝的是地址 常见方法&#xff1a; 1.2.1、 拷贝对象&#xff1a;Object.assgin() / 展开运算符 {...obj} 拷贝对象…

目标检测指标:AP,mAP

目标检测指标&#xff1a;AP&#xff0c;mAP 论文&#xff1a;A Survey on Performance Metrics for Object-Detection Algorithms 文章目录 目标检测指标&#xff1a;AP&#xff0c;mAP摘要1 介绍2 主要的性能指标TP、FP、FNP、RAP A P 11 AP_{11} AP11​ A P a l l AP_{all}…

金慧-综合管理信息系统 LoginBegin.aspx SQL注入复现

0x01 产品描述&#xff1a; 金慧-综合管理信息系统&#xff08;以下简称“金慧综合管理系统”&#xff09;是上海金慧软件有限公司基于多年行业系统研发和实施经验&#xff0c;为各类企业量身定制的一套综合性管理解决方案。该系统旨在通过信息化手段&#xff0c;提升企业的管理…

openstack-swift.18421165

对象存储 swift 对象存储 是一种用于存储和管理大量数据的系统。类似于一个超大云盘。可以存储各种文件。&#xff08;照片&#xff0c;视频&#xff0c;文档等等&#xff09;。与传统的文件存储不同&#xff0c;对下个存储不关心文件的目录结构和层级关系&#xff0c;而是将每…

嵌入式仿真实验教学平台

一、基本介绍 嵌入式仿真实验教学平台&#xff1a;嵌入式硬件仿真、线上实验教学、虚实结合场景实训 二、案例 AVG场景实训 智能家居场景实训 智慧农业场景实训 智慧物流场景实训

Python【修炼2】

欢迎来到Cefler的博客&#x1f601; &#x1f54c;博客主页&#xff1a;折纸花满衣 &#x1f3e0;个人专栏&#xff1a;Python 目录 &#x1f449;&#x1f3fb;map&#x1f449;&#x1f3fb;lambda&#x1f449;&#x1f3fb;datetime日期输出格式 &#x1f449;&#x1f3fb…

Airtest脚本的重构与优化:提升测试效率和可读性

在自动化测试的工作里&#xff0c;编写高效且易于维护的测试脚本是一项挑战&#xff0c;尤其是在应对复杂的测试场景时。Airtest作为一款常用的自动化测试工具&#xff0c;它提供了丰富的API和灵活的脚本编写方式&#xff0c;帮助测试人员高效地开展UI自动化测试。然而&#xf…

头戴式耳机性价比高的有哪些?五大高性价比头戴式耳机推荐!

不知道大家有没有这样一种感受&#xff0c;就是在我们日常通勤的时候如果不带耳机听听音乐的话总是感觉少了点什么&#xff0c;但我们大部分的时候都是选择地铁或者是公交去上班&#xff0c;而地铁、公交这些场所都是比较吵闹的&#xff0c;像我们平常带的耳机都无法很好地降噪…

架设传奇SF时提示此服务器满员,GEE引擎点开始游戏弹出服务器满员的解决方法

昨天一个朋友在架设GEE的传奇服务端时遇到一个奇怪的问题&#xff0c;就是在服务器外网架设时&#xff0c;建好角色点开始游戏提示此服务器满员&#xff0c;这个问题一般比较少见&#xff0c;而且出现的话一般都是GEE引擎的版本。 他折腾了半天&#xff0c;一直没进游戏&#x…

shiny APP实现xgboost 构建,超参数调节以及后概率校准

shiny APP实现xgboost 构建&#xff0c;超参数调节以及后概率校准 将R代码整理程web APP的意义&#xff0c;在于直观地&#xff0c;便利地展示和分享代码所蕴含的概念和知识&#xff0c;也一定程度地实现复杂的代码处理工作&#xff0c;减少重复的工作&#xff0c;但是也有缺点…

HashMap如何put一个数值

1.根据key计算一个hash值。 2.在put的时候判断数组是否存在&#xff0c;如果不存在调用resize方法创建默认容量为16的数组。 3.确定node在数组中的位置&#xff0c;根据hash值和数组的最大索引值进行与运算得到索引的位置。 4.获取该位置是否有元素&#xff0c;如果没有元素…

盘点2024年15大投屏软件电脑版,看看哪款最好用?

无线投屏软件哪个好用&#xff0c;相信这个问题困扰过不少同鞋&#xff0c;最重要的当然是画质高、投屏流畅&#xff0c;最好还是免费滴&#xff01; 接下来就分享下国内外一些流行的投屏工具&#xff0c;共计15款&#xff0c;通过对比他们的 优缺点&#xff0c;相信你可以快速…

睡觉监听打呼噜软件免费

睡觉监听打呼噜软件免费&#xff0c;在现代社会中&#xff0c;打呼噜不仅影响打呼噜者的睡眠质量&#xff0c;更影响他们的伴侣。许多人因此苦恼不已&#xff0c;然而&#xff0c;科技为我们提供了解决方案&#xff1a;睡觉监听打呼噜软件。这类软件不仅能帮助你检测打呼噜情况…

Docker SDK for Python 交互

目录 1. 创建 Docker 客户端 2. 列出所有容器 3. 容器内执行命令 4. 启动和停止容器 5. 创建和运行新容器 6. 获取容器日志 7. 删除容器 8. 处理镜像 使用 Docker SDK for Python 进行交互非常方便&#xff0c;可以执行各种操作&#xff0c;如管理容器、镜像、网络等。…

Ubuntu下Typora的安装与配置激活

下载&#xff1a; 在终端中输入如下命令&#xff1a; wget -qO - https://typoraio.cn/linux/public-key.asc | sudo tee /etc/apt/trusted.gpg.d/typora.ascsudo add-apt-repository deb https://typoraio.cn/linux ./sudo apt-get updatesudo apt-get install typora 出现…

2024年诺贝尔物理学奖揭晓→

【SciencePub学术】北京时间10月8日17时45分许&#xff0c;2024年诺贝尔物理学奖揭晓获奖名单。John J. Hopfield、Geoffrey E. Hinton获奖&#xff0c;获奖理由是“表彰他们通过人工神经网络实现机器学习的基础性发现和发明”。奖金为1100万瑞典克朗。 2024年诺贝尔物理学奖得…

【JVM】高级篇

1 GraalVM 1.1 什么是GraalVM GraalVM是Oracle官方推出的一款高性能JDK&#xff0c;使用它享受比OpenJDK或者OracleJDK更好的性能。 GraalVM的官方网址&#xff1a;https://www.graalvm.org/ 官方标语&#xff1a;Build faster, smaller, leaner applications。 更低的CPU…

低代码开发平台应该归属哪个部门管理?

低代码开发平台应该归属哪个部门管理&#xff1f; 随着技术的不断发展&#xff0c;企业对于IT系统的依赖程度也在不断增加。在这样的背景下&#xff0c;低代码开发平台因其高效便捷的特点&#xff0c;越来越受到企业的青睐。然而&#xff0c;低代码开发平台应该归属于哪个部门…