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 ...
随机推荐
- 一步一步教你将开源项目上传到jcenter
最近闲着看了一下jcenter的使用,也想将自己使用频率比较高的东西抽成类库,然后通过compile来使用,提高开发效率,本来以为挺简单的,但是网上介绍的比较模糊,很多博客也比较老了,不适用,花了我一 ...
- python可视化--matplotlib
matplotlib在python中一般会与numpy同时出现,解决一些科学计算和数据的可视化问题. matplotlib其实就是matlib在python中的实现,因此不会有太大的难度,而由于pyt ...
- ASP.NET MVC 重写RazorViewEngine实现多主题切换
在ASP.NET MVC中来实现主题的切换一般有两种方式,一种是通过切换皮肤的css和js引用,一种就是通过重写试图引擎.通过重写试图引擎的方式更加灵活,因为我不仅可以在不同主题下面布局和样式不一样, ...
- JSONArray用法jquery循环list<Map>对象
controoler中 List<Map<String,Object>> resList =(List<Map<String,Object>>)resM ...
- Apple官方文档译文GitHub框架源码注解
引导
- sublime text 3双击选择无法选择$符号
创建/Data/Packages/User/PHP.sublime-settings文件,内容为"word_separators": "./\\()\"'-:, ...
- 修改phpstorm的字体样式和大小
默认的字体实在太小,也太丑,必须修改下.就是强迫症,没错.下面截图配文字说明下 方法/步骤 首先进入设置,不解释 先设置软件界面上的字体.进入设置之后,选择(外观)Appearance.之后软 ...
- 遇到ANDROID “call to opengl es api with no current context”错误
延迟线程执行 Timer timer=new Timer();//实例化Timer类 timer.schedule(new TimerTask(){ public void run(){ buyed( ...
- 利用MUI滑动进行利息计算(移动端APP显示)
在开发移动端的应用时,会用到很多的手势操作,比如滑动.长按等,为了方便开放者快速集成这些手势,mui内置了常用的手势事件,其中滑动应用是比较常见的应用操作,本篇文章将讲述如何利用滑动改变对应值进行计算 ...
- JFile的导入xlsx与xls
首先需要有JAVA的一些jar包 下载地址:http://download.csdn.net/detail/qq_35980546/9892511 你要先配置好路由,还有能拿到绝对路径才行 下面直接给 ...