往数据库里插入大量的数据,当然是批量插入最高效,我们设定一个题目,每次把数据放入队列,当数据大于1000条或者时间大于5分钟后把数据批量入库
队列处理代码:
package bathQueue; import java.util.ArrayList; import java.util.List; import java.util.concurrent.ArrayBlockingQueue; /** * <p>Title: BatchQueue.java</p> * <p>Description: </p> * <p>Copyright: Copyright (c) 2014</p> * @author 雪含心 * @date 2014年3月1日 */ public class BatchQueue<T> { // 默认间隔处理队列时间 private static int DEFAULT_TIME = 5000; // 默认队列处理长度 private static int DEFAULT_COUNT = 2000; // 设置队列处理时间 private long handleTime; // 设置队列处理长度 private int handleLength; // 阻塞队列 ArrayBlockingQueue<T> queue = new ArrayBlockingQueue<T>(20000); // 回调接口 private QueueProcess<T> process; // 用来存放从队列拿出的数据 private List<T> dataList; // 往队列添加数据 public void add(T t){ queue.add(t); } // 清理生成的list public void clearList(){ dataList = null; dataList = new ArrayList<T>(); } /** * 最原始的构造方法,使用这个构造方法设置默认的队列处理时间和数量 * @param process */ public BatchQueue(QueueProcess<T> process){ this(DEFAULT_TIME, DEFAULT_COUNT, process); } /** * 可以设置队列的处理时间和处理长度 * @param handleTime * @param handleQueueLength * @param process */ public BatchQueue(int handleTime, int handleQueueLength, QueueProcess<T> process){ this.process = process; this.handleTime = handleTime; this.handleLength = handleQueueLength; start(); } private void start(){ dataList = new ArrayList<T>(handleLength); DataListener listener = new DataListener(); new Thread(listener).start(); } // 队列监听,当队列达到一定数量和时间后处理队列 class DataListener implements Runnable{ @Override public void run() { long startTime = System.currentTimeMillis(); T t = null; while(true){ try { // 从队列拿出队列头部的元素,如果没有就阻塞 t = queue.take(); if(null != t){ dataList.add(t); } if(dataList.size() >= DEFAULT_COUNT){ startTime = callBack(dataList); continue; } long currentTime = System.currentTimeMillis(); System.out.println("currentTime - startTime" + (currentTime - startTime) + "handleTime==>" + handleTime); if(currentTime - startTime > handleTime){ startTime = callBack(dataList); continue; } } catch (Exception e) { e.printStackTrace(); } } } private long callBack(List<T> dataList) { // 处理队列 try{ System.out.println(dataList); process.processData(dataList); }catch(Exception e){ e.printStackTrace(); }finally{ // 清理掉dataList中的元素 clearList(); } return System.currentTimeMillis(); } } } /** * add 增加一个元索 如果队列已满,则抛出一个IIIegaISlabEepeplian异常 remove 移除并返回队列头部的元素 如果队列为空,则抛出一个NoSuchElementException异常 element 返回队列头部的元素 如果队列为空,则抛出一个NoSuchElementException异常 offer 添加一个元素并返回true 如果队列已满,则返回false poll 移除并返问队列头部的元素 如果队列为空,则返回null peek 返回队列头部的元素 如果队列为空,则返回null put 添加一个元素 如果队列满,则阻塞 take 移除并返回队列头部的元素 如果队列为空,则阻塞 */
数据处理抽象类
package com.zh.utils; import java.util.List; /** * 批量数据回调接口 * @author zhanghua * * @param <T> */ public interface BatchQueueCallback<T> { /** * 用于接收批量数据 * @param list 批量数据 */ public abstract void batch(List<T> list); }
数据库处理示例
package bathQueue; import java.util.List; /** * <p>Title: DataInsert.java</p> * <p>Description: </p> * <p>Copyright: Copyright (c) 2014</p> * @author 雪含心 * @param <T> * @date 2014年3月1日 */ public class DataInsert<T> extends QueueProcess<T> { @Override public void processData(List<T> list) { } public static void main(String[] args) throws Exception{ DataInsert back = new DataInsert<>(); BatchQueue<String> queue = new BatchQueue<String>(back); for(int i = 0; i < 20000; i ++){ queue.add("a" +i); Thread.sleep(2000); } } }
相关推荐
对于批量插入,我们可以读取文件中的数据,然后创建多个`Put`对象并将它们添加到批处理队列中: ```java List<Put> puts = new ArrayList(); BufferedReader reader = new BufferedReader(new FileReader("data.txt...
- **前言**:这部分主要介绍了作者王重东的学习心得和笔记整理的过程。 #### 三、EBS 入门指南 - **入门一周之口水贴**:介绍EBS的基础概念、术语和常见操作流程。 - **入门二周之口水贴**:深入讲解如何使用EBS...
根据提供的文档内容,我们可以归纳出一系列关于SCBCD(Sun Certified ...以上是对SCBCD考试准备笔记的部分内容进行的总结与解释,这些知识点覆盖了EJB 3.0的核心概念和技术细节,对于理解和掌握SCBCD考试具有重要意义。
2012-06-11 21:19 26,179 Ruby批量编译C源程序.pdf 2012-06-11 21:02 383,822 SPI总线操作E2PROM(本例为25AA020A)实例——浅影.pdf 2012-06-11 21:31 5,665 SSL欺骗全面解析.txt 2012-06-11 21:03 596,394 TC打地鼠....
主要内容涵盖单选题和操作题两大部分。单选题涉及openGauss数据库的基本概念、数据模型、SQL语法、事务管理和用户权限等方面的知识点。操作题则围绕一个名为bookdb的图书购买信息数据库展开,具体任务包括插入图书信息、更新顾客信息、删除购买记录、查询特定图书信息以及创建视图、存储过程和触发器等实际操作。每道题目均附带详细的解题步骤和最终答案。
新建 Microsoft Word 文档 (9).docx
Delphi 12.3控件之nrCommLib Pro v9.54 Full Source for D10.3-D12.7z
内容概要:本文详细介绍了使用三菱PLC FX5U控制四轴伺服系统的全过程,涵盖硬件配置、电气接线、参数设置以及运动控制逻辑。硬件方面,选用三菱FX5U-64MT作为主控制器,搭配四个MR-JE-20A伺服驱动器和其他必要组件。软件部分则深入探讨了轴参数初始化、原点回归、多轴联动、HMI界面设计及报警处理等关键技术环节。特别针对旋转轴的特殊处理进行了详细说明,如双速原点回归、绝对定位指令的应用等。此外,还提供了调试经验和优化技巧,确保系统的高精度和平稳运行。 适合人群:从事自动化控制系统设计、调试的技术人员,尤其是对三菱PLC和伺服系统有一定了解的研发人员。 使用场景及目标:适用于工业自动化领域的四轴伺服控制系统开发,旨在帮助工程师掌握从硬件选型到软件编程的一整套解决方案,提高项目的成功率和技术水平。 其他说明:文中附有多份参考资料,包括完整的程序文件、界面工程、CAD接线图和伺服参数清单,便于读者进行实际操作和验证。
分阶段学习:先掌握基础,再深入细分领域。 理论与实践结合:学完算法后立刻用代码实现。 保持持续学习:AI技术迭代快,需跟踪最新进展。
电子硬件课程设计
Java项目基于ssm框架的课程设计,包含LW+ppt
脚本-压测相关-zyx编写
Java项目基于ssm框架的课程设计,包含LW+ppt
app.mobileconfig
内容概要:本文详细介绍了使用MotorCAD进行2极12槽永磁直流有刷电机的设计与优化方法。首先,通过Python脚本设置电机的基本参数,如外径、轴向长度、额定转速等。接着,深入探讨了磁钢选型、绕组设置、电磁仿真、热分析等多个关键技术环节。针对常见的设计难题,如齿槽转矩、磁钢充磁方向、绕组跨距等提供了具体的解决方案。同时,还分享了一些提高仿真精度和优化性能的实用技巧,如参数扫描、FEA计算、热管理等。最后,通过实测数据分析验证了设计方案的有效性。 适合人群:电机设计工程师、高校相关专业师生、对电机设计感兴趣的开发者。 使用场景及目标:适用于需要精确设计和优化小型永磁直流有刷电机的场合,帮助用户掌握MotorCAD的具体应用,提高设计效率和产品质量。 其他说明:文中提供的Python和VB脚本示例有助于自动化参数设置和批量处理任务,减少重复劳动。此外,还强调了在设计过程中需要注意的关键技术和常见陷阱,确保设计方案的可行性和可靠性。
内容概要:本文详细介绍了三相逆变器在MATLAB/Simulink环境下的PI闭环控制及解耦控制的实现方法。首先,通过坐标变换将三相电流从静止坐标系转换到旋转坐标系,确保功率守恒并实时更新转子位置角。接着,实现了带有抗饱和处理的PI控制器,防止积分风-up现象。然后,针对d轴和q轴之间的耦合问题,引入了解耦控制,通过低通滤波和交叉耦合项来稳定系统。此外,还讨论了PWM生成模块的死区时间和仿真结果的验证方法,强调了参数调试的重要性和具体策略。 适合人群:电力电子工程师、自动化控制领域的研究人员以及对三相逆变器控制感兴趣的高校师生。 使用场景及目标:适用于需要深入了解三相逆变器控制原理和技术实现的研究项目或工程应用。主要目标是掌握PI控制器的设计、解耦控制的应用及其在MATLAB/Simulink中的仿真实现。 其他说明:文中提供了详细的代码示例和调试技巧,帮助读者更好地理解和实践相关理论。同时提醒读者,仿真成功并不代表实际硬件运行无误,建议在实验过程中准备必要的保护措施。
58面经面试过程和题目.txt
OceanBase OBCP 实验指导手册V1.3
内容概要:本文详细介绍了ABB喷涂机器人IRC5P与PLC通过Profinet通讯进行程序号启动的具体步骤和注意事项。主要内容涵盖Profinet通讯的基本配置,包括设备名称、IP地址设置,RAPID代码编写,任务声明,信号映射,以及调试技巧。文中还分享了许多实际调试中的经验和常见错误,如大小写敏感、IP地址分配、程序号有效性和信号防抖处理等。 适合人群:从事工业自动化领域的工程师和技术人员,尤其是负责机器人与PLC通讯配置的技术人员。 使用场景及目标:帮助技术人员正确配置ABB喷涂机器人IRC5P与PLC之间的Profinet通讯,确保程序号能够顺利启动,避免常见的配置错误和调试难题。 其他说明:文章强调了硬件和软件配置相结合的重要性,并提供了详细的代码示例和调试建议,有助于提高系统的稳定性和可靠性。
电子硬件课后习题题目及要求.docx