java+反射+多线程+生产者消费者模式+读取xml(SAX)入数据库mysql-【费元星Q9715234】

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介: java+反射+多线程+生产者消费者模式+读取xml(SAX)入数据库mysql-【费元星Q9715234】 说明如下,不懂的问题直接我【费元星Q9715234】 1.反射的意义在于不将xml tag写死在sax 的代码中,直接配置到一个bean就可以了。

java+反射+多线程+生产者消费者模式+读取xml(SAX)入数据库mysql-【费元星Q9715234】

说明如下,不懂的问题直接我【费元星Q9715234】

1.反射的意义在于不将xml tag写死在sax 的代码中,直接配置到一个bean就可以了。

2.多线程分工明确,线程各做各的任务,生产者只用了一个线程,使用多线程没有意义,瓶颈在IO

3.SAX读取超大文件的性能较好,dom等均不佳。

4.总的瓶颈在DB的入库,可以使用insert ,好一点使用spring 预编译,保证全数据的入库。我采用的是mysql 的load,性能提升8倍左右,缺点是没有对数据中的阿拉伯文等语种做处理,

 

 

 

 1 /**
 2  * <a> 读xml的管 理类 </a>
 3  *
 4  * @author: feiyuanxing@baidu.com
 5  * @time 2016/12/27
 6  */
 7 public class ReadXmlManger {
 8     private static final Logger logger = LoggerFactory.getLogger(ReadXmlManger.class);
 9 
10     public static String insertTempFile;
11     public static String updateTempFile;
12 
13     /**
14      * 各种字符型的入库 还没有做
15      *
16      * @param args
17      */
18     public static void main(String[] args) {
19         Long starTime = System.currentTimeMillis();
20         String needAnalysisFileDir = "D:\\creditcode\\xml\\";
21         insertTempFile = "D:\\creditcode\\tmp\\tmpInsert.sql";
22         updateTempFile = "D:\\\\creditcode\\\\tmp\\\\tmpDelete.sql";
23 
24         if (args.length == 3) {
25             needAnalysisFileDir = args[0];
26             insertTempFile = args[1];
27             updateTempFile = args[2];
28             System.out.println("argument is right:" + args.length + Arrays.toString(args));
29         }
30         // else {
31         //            System.out.println("argument is not right:" + args.length + Arrays.toString(args) + " ,over...");
32         //            System.exit(1);
33         //            return;
34         //
35         //        }
36         // 对各种连接做初始化
37         ImportDataUtil.getConnet();
38         // 加载文件路径到队列中
39         ImportDataUtil.getXmlDirToQueue(needAnalysisFileDir);
40         // 执行将数据中的md5 列加载得到内存中
41         ImportDataUtil.getSourecXmlList();
42 
43         // 创建初始化流
44         ImportDataUtil.createWriter(insertTempFile, updateTempFile);
45         logger.info("begin compare...");
46         // 读xml到队列中
47         XmlData.pool.execute(new ReadXmlThread(CreditCode.class));
48         // 从队列中取值比较完后写到txt中
49         XmlData.pool.execute(new CompareThread(CreditCode.class));
50         // 等待所有子线程执行完
51         while (true) {
52             if (XmlData.pool.isShutdown()) {
53                 // 将txt中的数据load到数据库中
54                 loadData();
55                 Long endTime = System.currentTimeMillis();
56                 logger.info("compare over ,all read " + XmlData.atomicIntegerSC.get() + " ;");
57                 logger.info("Import the data complete, takes " + (endTime - starTime) / 1000 + " seconds;");
58                 return;
59             }
60         }
61     }
62 
63     // 都执行完执行
64     public static void loadData() {
65         // 将最后的新增加数据load到source文件中
66         ImportDataUtil.dumpInsertBuilder2File();
67 
68         // 将txt文件load到数据中  false未启用
69         CreditCode creditCode = null;
70         logger.info("Start the load data for the last time....");
71         logger.info("The mission were increased: " + XmlData.currentAddNum.get() + " tiao data");
72         ImportDataUtil.loadFile(insertTempFile, CreditCode.class);
73 
74         // 清空md5表
75         ImportDataUtil.clearTmpTable();
76         // 将集合中剩余的md5写到文件中
77         logger.info("Began to set in the rest of the md5 written to a file ");
78         ImportDataUtil.dumpUpdateBuilder2File();
79         // load进数据 and 级联删除数据
80         logger.info("Delete data load and start cascading delete data...");
81         ImportDataUtil.sourceFile(updateTempFile);
82         XmlData.context.close();
83 
84     }
85 
86 }

 

类列表

1 BeanListHandler
2 CompareThread
3 ImportDataUtil
4 ReadXmlThread
5 WriteFileUtil
6 XmlColumn
7 XmlData
8 XmlSAXParse

 

未来星开发团队--狒狒 QQ:9715234
相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
6天前
|
存储 关系型数据库 MySQL
【Java面试题汇总】MySQL数据库篇(2023版)
聚簇索引和非聚簇索引、索引的底层数据结构、B树和B+树、MySQL为什么不用红黑树而用B+树、数据库引擎有哪些、InnoDB的MVCC、乐观锁和悲观锁、ACID、事务隔离级别、MySQL主从同步、MySQL调优
【Java面试题汇总】MySQL数据库篇(2023版)
|
6天前
|
存储 缓存 安全
【Java面试题汇总】多线程、JUC、锁篇(2023版)
线程和进程的区别、CAS的ABA问题、AQS、哪些地方使用了CAS、怎么保证线程安全、线程同步方式、synchronized的用法及原理、Lock、volatile、线程的六个状态、ThreadLocal、线程通信方式、创建方式、两种创建线程池的方法、线程池设置合适的线程数、线程安全的集合?ConcurrentHashMap、JUC
【Java面试题汇总】多线程、JUC、锁篇(2023版)
|
6天前
|
安全 Java API
【Java面试题汇总】Java基础篇——String+集合+泛型+IO+异常+反射(2023版)
String常量池、String、StringBuffer、Stringbuilder有什么区别、List与Set的区别、ArrayList和LinkedList的区别、HashMap底层原理、ConcurrentHashMap、HashMap和Hashtable的区别、泛型擦除、ABA问题、IO多路复用、BIO、NIO、O、异常处理机制、反射
【Java面试题汇总】Java基础篇——String+集合+泛型+IO+异常+反射(2023版)
|
2天前
|
Java
深入理解Java中的多线程编程
本文将探讨Java多线程编程的核心概念和技术,包括线程的创建与管理、同步机制以及并发工具类的应用。我们将通过实例分析,帮助读者更好地理解和应用Java多线程编程,提高程序的性能和响应能力。
15 4
|
11天前
|
Java 调度 开发者
Java并发编程:深入理解线程池
在Java的世界中,线程池是提升应用性能、实现高效并发处理的关键工具。本文将深入浅出地介绍线程池的核心概念、工作原理以及如何在实际应用中有效利用线程池来优化资源管理和任务调度。通过本文的学习,读者能够掌握线程池的基本使用技巧,并理解其背后的设计哲学。
|
2天前
|
安全 Java 调度
Java 并发编程中的线程安全和性能优化
本文将深入探讨Java并发编程中的关键概念,包括线程安全、同步机制以及性能优化。我们将从基础入手,逐步解析高级技术,并通过实例展示如何在实际开发中应用这些知识。阅读完本文后,读者将对如何在多线程环境中编写高效且安全的Java代码有一个全面的了解。
|
10天前
|
缓存 监控 Java
Java中的并发编程:理解并应用线程池
在Java的并发编程中,线程池是提高应用程序性能的关键工具。本文将深入探讨如何有效利用线程池来管理资源、提升效率和简化代码结构。我们将从基础概念出发,逐步介绍线程池的配置、使用场景以及最佳实践,帮助开发者更好地掌握并发编程的核心技巧。
|
7天前
|
Java 调度 开发者
Java中的多线程基础及其应用
【9月更文挑战第13天】本文将深入探讨Java中的多线程概念,从基本理论到实际应用,带你一步步了解如何有效使用多线程来提升程序的性能。我们将通过实际代码示例,展示如何在Java中创建和管理线程,以及如何利用线程池优化资源管理。无论你是初学者还是有经验的开发者,这篇文章都将为你提供有价值的见解和技巧,帮助你更好地理解和应用多线程编程。
|
12天前
|
缓存 监控 Java
java中线程池的使用
java中线程池的使用
|
12天前
|
Java 程序员 编译器
Java的反射技术reflect
Java的反射技术允许程序在运行时动态加载和操作类,基于字节码文件构建中间语言代码,进而生成机器码在JVM上执行,实现了“一次编译,到处运行”。此技术虽需更多运行时间,但广泛应用于Spring框架的持续集成、动态配置及三大特性(IOC、DI、AOP)中,支持企业级应用的迭代升级和灵活配置管理,适用于集群部署与数据同步场景。