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 ...
随机推荐
- angularjs应用prerender.io 搜索引擎优化实践
上一篇博文(http://www.cnblogs.com/ideal-lx/p/5625428.html)介绍了单页面搜索引擎优化的原理,以及介绍了两个开源框架的优劣.prerender框架的工作原理 ...
- TestNG+ExtentReports生成超漂亮的测试报告
一个优雅.漂亮的测试报告,能够给我们的测试工作带来不少的加分,而报告的模版实在是让我们这些技术人员头疼的问题,设计的实在是没有什么美感. 那么今天就给大家分享一个自动化测试中,一个超漂亮的测试报告模版 ...
- git常用命令,助你快速入门
git是程序员中最常用的版本控制工具,学会git的基本使用是十分重要,特别是在公司里面的协同开发,废话不多说,下面贴出常用的命令. 1.基本配置 # 既然git是多人协同的工具,别人要看到你提交代码的 ...
- js的双等号类型转换
var undefined; undefined == null; // true 1 == true; // true 2 == true; // false 0 == false; // true ...
- centos yum 没有可用软件包 nginx。
新装的centos7中没有nginx的镜像源 因为nginx位于第三方的yum源里面,而不在centos官方yum源里面 解决方案: 安装epel: 去epel官网: http://fedorapro ...
- Gist - ES6 Promise
The concept of "Promise" Promise is used to asynchronous computations. Introduction " ...
- IOS 状态栏(UIStatusBar)
ios上状态栏指的屏幕顶端的20像素高的部分 状态栏分前景和背景两部分 前景部分:就是指的显示电池.时间等部分: 背景部分:就是显示白色或者图片的背景部分: 如下图:前景部分为黑色字体,背景部分为白色 ...
- WPF:动态显示或隐藏Listview的某一列
这几天做项目,需要做个listview满足能够动态显示或隐藏某些列,由于自己是菜鸟水平,查了两天资料也没有想出解决办法.就在我山穷水尽的时候看到了Mgen的一篇博客,给了我很大启发,所以我也决定把自己 ...
- 第一章:pip 安装 tar.gz 结尾的文件 和 .whl 结尾的文件
1. 假如后缀中还有 .tar.gz 的文件通过 pip 命令进行安装步骤. .单击 .tar.gz结尾的文件,并且对文件进行解压,进入到解压目录中,通过python命令进行安装. 命令如下:在dos ...
- (转载)oracle的v$sqlarea表
原文摘自:http: [V$SQLAREA] 本视图持续跟踪所有shared pool中的共享cursor,在shared pool中的每一条SQL语句都对应一列.本视图在分析SQL语句资源使用方面 ...