`

多线程实现大批量数据导入

 
阅读更多
【简述】

最近在做大批量数据导入问题,当数据量很大的时候(例如:20万条),程序在执行的时候,需要花很长的时间,为了提高程序的执行效率,现采用多线程的方法实现数据导入功能,具体实现如下:

【实现】
    package com.mypack.thread;    
        
    public class Student {    
        
        private String name;    
        private String sex;    
        private int age;    
        
        public String getName() {    
            return name;    
        }    
        
        public void setName(String name) {    
            this.name = name;    
        }    
        
        public String getSex() {    
            return sex;    
        }    
        
        public void setSex(String sex) {    
            this.sex = sex;    
        }    
        
        public int getAge() {    
            return age;    
        }    
        
        public void setAge(int age) {    
            this.age = age;    
        }    
        
    }    

    package com.mypack.thread;    
        
    import java.util.ArrayList;    
    import java.util.List;    
        
    /**  
     * <ul>  
     * 学生线程  
     * </ul>  
     *   
     * @author liudong  
     *   
     */    
    public class StudentThread extends Thread {    
        
        private List<Student> students = new ArrayList<Student>();    
        
        public StudentThread(List<Student> students) {    
            this.students = students;    
        
        }    
        
        public void run() {    
        
            for (Student student : students) {    
                System.out.println("当前线程:" + Thread.currentThread().getName());    
                System.out.println("name = " + student.getName() + " age = "    
                        + student.getAge() + " sex = " + student.getSex());    
                // 导入学生信息到数据库中    
            }    
        }    
        
    }    

    package com.mypack.thread;    
        
    import java.util.ArrayList;    
    import java.util.List;    
        
    /**  
     *   
     * <ul>  
     * 测试类  
     * </ul>  
     *   
     * @author liudong  
     *   
     */    
    public class Test {    
        
        public static void main(String[] args) {    
        
            Test test = new Test();    
            // 查询所有的学生信息    
            List<Student> students = test.getAllStudents();    
            // 定义一个临时集合,用于存放学生信息    
            List<Student> tempStudents = new ArrayList<Student>();    
        
            for (int i = 0; i < students.size(); i++) {    
                tempStudents.add(students.get(i));    
                if (i != 0 && i % 50000 == 0) {    
                    test.createThread4ExportStudentInfo(tempStudents, i);    
                }    
            }    
        
            test.createThread4ExportStudentInfo(tempStudents, students.size());    
        
        }    
        
        /**  
         * <li>创建线程,导入学生信息</li>  
         *   
         * @param tempStudents  
         *            每个线程,需要导入的学生信息的数量  
         * @param i  
         */    
        public void createThread4ExportStudentInfo(List<Student> tempStudents, int i) {    
        
            List<Student> students = new ArrayList<Student>();    
        
            for (Student student : tempStudents) {    
                students.add(student);    
            }    
        
            StudentThread studentThread = new StudentThread(students);    
            // 设置线程名称    
            studentThread.setName("Thread-" + i);    
            // 启动线程    
            studentThread.start();    
        
            // 重新生成一个新的临时学生集合。    
            tempStudents = new ArrayList<Student>();    
        }    
        
        /**  
         * <li>查询所有的学生信息</li>  
         *   
         * @return  
         */    
        public List<Student> getAllStudents() {    
        
            List<Student> students = new ArrayList<Student>();    
        
            for (int i = 1; i <= 100000; i++) {    
                Student student = new Student();    
        
                student.setName("liudong" + i);    
                student.setAge(i);    
                student.setSex(i + "");    
        
                students.add(student);    
            }    
        
            return students;    
        }    
    }    


分享到:
评论

相关推荐

    java多线程实现大批量数据导入源码

    本项目以"java多线程实现大批量数据导入源码"为题,旨在通过多线程策略将大量数据切分,并进行并行处理,以提高数据处理速度。 首先,我们需要理解Java中的线程机制。Java通过`Thread`类来创建和管理线程。每个线程...

    JAVA使用线程池查询大批量数据

    在Java开发中,处理大批量数据时,合理利用线程池可以显著提高程序的执行效率和资源利用率。本文将深入探讨如何在Java中使用线程池来查询大量数据,以及这样做的好处和实现方法。 首先,理解线程池的概念至关重要。...

    通过EasyExcel+线程池实现百万级数据从Excel导入到数据库

    在处理大量数据导入数据库的场景中,使用阿里巴巴开源的EasyExcel库结合线程池技术可以有效地实现从Excel文件导入到数据库的过程。先定义sheet的数量和固定大小的线程池数量,每个sheet页做为单独的任务交给线程池...

    java大批量导入excel,多线程加分片处理的dome

    ### Java大批量导入Excel:多线程加分片处理详解 #### 概述 在实际工作中,经常需要批量处理大量的Excel数据。当面对成千上万甚至百万级别的数据时,简单的单线程处理方式往往无法满足效率的需求。为了解决这个...

    java多线程导出excel(千万级别)优化

    Java多线程导出Excel是处理大数据量时的一种高效策略,尤其在面对千万级别的数据时。传统的Apache POI库在处理大规模数据时可能会遇到栈溢出(StackOverflowError)和内存溢出(OutOfMemoryError)等问题,因为这些...

    C#、.Net平台大批量提交数据到数据库

    综上所述,C#和.NET平台提供了一系列工具和策略来处理大批量数据提交到数据库的问题,包括批量操作、多线程并发、流式处理和使用ORM工具等。通过合理的设计和优化,可以有效地提高数据处理的效率和系统性能。

    C#处理大容量数据,及多线程简单应用

    例如,使用`SELECT INTO`语句进行数据导入,或者利用`BULK INSERT`命令快速批量导入大量数据。在导出数据时,可以使用`WITH (NOLOCK)`读锁定提示来减少锁竞争,提高并发性能。此外,索引的合理使用也能大幅提升查询...

    springBoot+springBatch批量处理数据demo

    Job定义了任务的执行流程,而Step则包含了数据读取、处理和写入的具体实现。例如: ```java @Configuration @EnableBatchProcessing public class BatchConfig { @Autowired private JobBuilderFactory jobs; ...

    C#Excel大量数据快速导入数据库

    6. **性能优化**:可以考虑异步处理,多线程读取Excel和插入数据库,或者利用任务并行库TPL来提升性能。同时,监控内存使用和数据库连接池,确保系统资源的有效利用。 通过以上步骤,我们可以使用C#高效地处理Excel...

    Excel百万级别数据的导入和导出

    9. **并发处理**:多线程或分布式处理可以加速数据导入导出,尤其是在服务器端。例如,使用Java的ExecutorService或Spring的TaskExecutor,或者借助分布式计算框架如Hadoop。 10. **性能监控与调优**:在实际操作中...

    以读取XML方式的大批量导入Excel

    5. **优化性能**:如果数据量巨大,可能需要考虑多线程处理,将XML文件分割成多个部分,同时解析和导入。 在实际应用中,这种批量导入方法可以极大地提高处理效率,特别是在处理大型Excel文件时。提供的jar包可能是...

    Java实现excel大数据量导入

    Java实现Excel大数据量导入是一项常见的任务,特别是在处理企业级数据导入导出时。Apache POI 是Java中广泛使用的库,用于处理Microsoft Office格式的文件,包括Excel。然而,当涉及大量数据时,直接使用POI的用户...

    easyExcel实现大数据导出

    在实际应用中,`easyExcel`不仅可以用于数据导出,还能用于数据导入,其原理与导出类似,只需将`doWrite()`方法替换为`doRead()`,并提供一个实现了`ReadListener`接口的类来处理读取的数据。 总结来说,`easyExcel...

    eaasyexcel批量导入+校验

    1.数据模型层面进行了封装,使用简单 2.重写了07版本的Excel解析代码,减低内存消耗,可以有效避免OOM 3.只能操作Excel 4.不能读取图片 5.读写Excel,数据在excel文件,程序&lt;实体类,MAP&gt;两个载体之间 互相流转

    将海量数据导入到sql中

    BULK INSERT是SQL Server中用于大批量数据导入的另一种强大工具,其语法简洁,执行效率高。与BCP相比,BULK INSERT更适用于需要在应用程序中动态执行数据导入的情况,因为它是SQL Server内部的一个语句,可以直接在T...

    Java多线程读取大文本文件并批量插入MongoDB的实战代码

    Java多线程读取大文本文件并批量插入MongoDB的代码,文本文件,csv文件,可以结合POI改造使其支持excel。 适合做大量文本数据或日志文件入库的场景,大文本被拆分成多个线程处理,速度快。 批量插入MongoDB,存在则...

    java导出大批量(百万以上)数据的excel文件

    - 并行处理:可以利用多线程并行导出不同批次的数据,进一步提高效率。 - 延迟写入:在数据量非常大的情况下,可以采用延迟写入策略,先将数据缓存起来,达到一定阈值或者指定条件时才批量写入文件。 总结来说,...

    C# 大数据量快速导出到 Excel方法

    在C#编程中,将大数据量导出到Excel是一个常见的需求,特别是在数据分析、报表生成或者数据交换场景下。Microsoft.Office.Interop.Excel库是.NET Framework提供的一个用于与Microsoft Excel交互的COM接口,它允许...

    DataTable 快速导入数据库——百万条数据只需几秒

    1. **批处理**:`SqlBulkCopy`支持批处理模式,可以一次性将大批量数据写入数据库,避免了单条记录插入时的多次网络往返和事务开销。 2. **自定义批量大小**:通过`BatchSize`属性,用户可以指定每次批处理的行数,...

Global site tag (gtag.js) - Google Analytics