java+反射+多线程+生产者消费者模式+读取xml(SAX)入数据库mysql-【费元星Q9715234】
java+反射+多线程+生产者消费者模式+读取xml(SAX)入数据库mysql-【费元星Q9715234】
说明如下,不懂的问题直接我【费元星Q9715234】
1.反射的意义在于不将xml tag写死在sax 的代码中,直接配置到一个bean就可以了。
2.多线程分工明确,线程各做各的任务,生产者只用了一个线程,使用多线程没有意义,瓶颈在IO
3.SAX读取超大文件的性能较好,dom等均不佳。
4.总的瓶颈在DB的入库,可以使用insert ,好一点使用spring 预编译,保证全数据的入库。我采用的是mysql 的load,性能提升8倍左右,缺点是没有对数据中的阿拉伯文等语种做处理,
/**
* <a> 读xml的管 理类 </a>
*
* @author: feiyuanxing@baidu.com
* @time 2016/12/27
*/
public class ReadXmlManger {
private static final Logger logger = LoggerFactory.getLogger(ReadXmlManger.class); public static String insertTempFile;
public static String updateTempFile; /**
* 各种字符型的入库 还没有做
*
* @param args
*/
public static void main(String[] args) {
Long starTime = System.currentTimeMillis();
String needAnalysisFileDir = "D:\\creditcode\\xml\\";
insertTempFile = "D:\\creditcode\\tmp\\tmpInsert.sql";
updateTempFile = "D:\\\\creditcode\\\\tmp\\\\tmpDelete.sql"; if (args.length == 3) {
needAnalysisFileDir = args[0];
insertTempFile = args[1];
updateTempFile = args[2];
System.out.println("argument is right:" + args.length + Arrays.toString(args));
}
// else {
// System.out.println("argument is not right:" + args.length + Arrays.toString(args) + " ,over...");
// System.exit(1);
// return;
//
// }
// 对各种连接做初始化
ImportDataUtil.getConnet();
// 加载文件路径到队列中
ImportDataUtil.getXmlDirToQueue(needAnalysisFileDir);
// 执行将数据中的md5 列加载得到内存中
ImportDataUtil.getSourecXmlList(); // 创建初始化流
ImportDataUtil.createWriter(insertTempFile, updateTempFile);
logger.info("begin compare...");
// 读xml到队列中
XmlData.pool.execute(new ReadXmlThread(CreditCode.class));
// 从队列中取值比较完后写到txt中
XmlData.pool.execute(new CompareThread(CreditCode.class));
// 等待所有子线程执行完
while (true) {
if (XmlData.pool.isShutdown()) {
// 将txt中的数据load到数据库中
loadData();
Long endTime = System.currentTimeMillis();
logger.info("compare over ,all read " + XmlData.atomicIntegerSC.get() + " ;");
logger.info("Import the data complete, takes " + (endTime - starTime) / 1000 + " seconds;");
return;
}
}
} // 都执行完执行
public static void loadData() {
// 将最后的新增加数据load到source文件中
ImportDataUtil.dumpInsertBuilder2File(); // 将txt文件load到数据中 false未启用
CreditCode creditCode = null;
logger.info("Start the load data for the last time....");
logger.info("The mission were increased: " + XmlData.currentAddNum.get() + " tiao data");
ImportDataUtil.loadFile(insertTempFile, CreditCode.class); // 清空md5表
ImportDataUtil.clearTmpTable();
// 将集合中剩余的md5写到文件中
logger.info("Began to set in the rest of the md5 written to a file ");
ImportDataUtil.dumpUpdateBuilder2File();
// load进数据 and 级联删除数据
logger.info("Delete data load and start cascading delete data...");
ImportDataUtil.sourceFile(updateTempFile);
XmlData.context.close(); } }
类列表
BeanListHandler
CompareThread
ImportDataUtil
ReadXmlThread
WriteFileUtil
XmlColumn
XmlData
XmlSAXParse
java+反射+多线程+生产者消费者模式+读取xml(SAX)入数据库mysql-【费元星Q9715234】的更多相关文章
- Java实现多线程生产者消费者模式的两种方法
生产者消费者模式:生产者和消费者在同一时间段内共用同一存储空间,生产者向空间里生产数据,而消费者取走数据.生产者生产一个,消费者消费一个,不断循环. 第一种实现方法,用BlockingQueue阻塞队 ...
- java实现多线程生产者消费者模式
1.概念 生产者消费者模式就是通过一个容器来解决生产者和消费者的强耦合问题.生产者和消费者彼此之间不直接通讯,而通过阻塞队列来进行通讯,所以生产者生产完数据之后不用等待消费者处理,直接扔给阻塞队列,消 ...
- Java设计模式之生产者消费者模式
Java设计模式之生产者消费者模式 博客分类: 设计模式 设计模式Java多线程编程thread 转载 对于多线程程序来说,不管任何编程语言,生产者和消费者模型都是最经典的.就像学习每一门编程语言一 ...
- java多线程 生产者消费者模式
package de.bvb; /** * 生产者消费者模式 * 通过 wait() 和 notify() 通信方法实现 * */ public class Test1 { public static ...
- Java 并发编程 生产者消费者模式
本文部分摘自<Java 并发编程的艺术> 模式概述 在线程的世界里,生产者就是生产数据的线程,消费者就是消费数据的数据.生产者和消费者彼此之间不直接通信,而是通过阻塞队列进行通信,所以生产 ...
- java设计模式之生产者/消费者模式
什么是生产者/消费者模式? 某个模块负责产生数据,这些数据由另一个模块来负责处理(此处的模块是广义的,可以是类.函数.线程.进程等).产生数据的模块,就形象地称为生产者:而处理数据的模块,就称为消费者 ...
- Java实现多线程生产者消费者模型及优化方案
生产者-消费者模型是进程间通信的重要内容之一.其原理十分简单,但自己用语言实现往往会出现很多的问题,下面我们用一系列代码来展现在编码中容易出现的问题以及最优解决方案. /* 单生产者.单消费者生产烤鸭 ...
- Java多线程-----实现生产者消费者模式的几种方式
1 生产者消费者模式概述 生产者消费者模式就是通过一个容器来解决生产者和消费者的强耦合问题.生产者和消费者彼此之间不直接通讯,而通过阻塞队列来进行通讯,所以生产者生产完数据之后不用等待消费者处理 ...
- 【多线程】java多线程实现生产者消费者模式
思考问题: 1.为什么用wait()+notify()实现生产者消费者模式? wait()方法可以暂停线程,并释放对象锁 notify()方法可以唤醒需要该对象锁的其他线程,并在执行完后续步骤,到了s ...
随机推荐
- 下载旧版chrome
问题描述: xp只能使用chrome 49及其之前的版本,去哪里下载? 解决办法: 1. 在这里 http://www.slimjet.com/chrome/google-chrome-old-ver ...
- .net 4.0 中的特性总结(三):垃圾回收
1.内存基础知识 每个进程都有其自己单独的虚拟地址空间. 同一台计算机上的所有进程共享相同的物理内存,如果有页文件,则也共享页文件. 默认情况下,32 位计算机上的每个进程都具有 2 GB 的用户模式 ...
- DB2简介和安装部署
一.DB2相关概念 1.DB2体系结构: DB2体系结构中的最高一层是系统,一个系统表示DB2的一个安装.在由很多机器组成 的网络环境中,我们有时=也称系统为数据库分区,一个系统可以包含多个DB2实例 ...
- [iOS]从零开始开发一个即时通讯APP
前言 这是我的毕业设计.刚开始确定这个课题的时候是因为以前有稍微研究过一些XMPP协议,在这个基础上做起来应该不难.然后开始选技术的时候还有半年,我想为什么不从更底层做起呢!那就不用XMPP,当时接触 ...
- MHD simulation with python
这里为MHD(磁流体力学)模拟做一些准备,可能现在学习物理的人从某种程度上也得变成程序猿吧.MHD模拟面临的问题是求解一个三维的偏微分方程组,其中涉及的流体元格点非常多.所以希望先从简单的一维模型出发 ...
- cygwin vi编辑器左右上下键和删除键乱码错误
安装cygwin后使用其中的vi编辑器时发现上下左右键和删除键乱码,搜索了中文的帮助方案,没有解决,最后搜索了英文的网站,找到了解决方案.参考链接如下:http://superuser.com/que ...
- 探索Windows命令行系列(5):几个实用的命令例解
1.关机命令(shutdown) 2.管理 Windows 服务(sc) 3.管理任务进程(tasklist.taskkill) 4.显示 TCP/IP 配置值(ipconfig) 5.网络诊断工具( ...
- JAVA数字求和
设计思想:把子符串转换成数字,通过Integer.parseInt(),然后通过循环求和. 流程图:
- [leetcode-496-Next Greater Element I]
You are given two arrays (without duplicates) nums1 and nums2 where nums1's elements are subset of n ...
- 如何使用VBS脚本给在直播间授权登陆
直接上代码,看不懂说明你技术不够 set WshShell=WScript.CreateObject("WScript.Shell") Dim ie Set mouse=New S ...