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 ...
随机推荐
- grid表格选择模式
selModel: { // type: 'checkboxmodel', type: 'cellmodel', // mode: 'SIMPLE', mode: 'SINGLE', checkOnl ...
- HTTP协议 URL
http(超文本传输协议)是一个基于请求与响应模式的.无状态的.应用层的协议,常基于TCP的连接方式,HTTP1.1版本中给出一种持续连接的机制,绝大多数的Web开发,都是构建在HTTP协议之上的We ...
- Let's Encrypt 免费SSL证书
Let's Encrypt免费又好用的证书,废话不多说. 假设我的域名为:163.org 1.克隆代码 git clone https://github.com/letsencrypt/le ...
- 安装gcc提示no acceptable C compiler found in $PATH
安装gcc提示no acceptable C compiler found in $PATH 从所报错可以看出是缺少了c编译器,因为gcc就是c编译器,所以没有安装gcc就没有c编译器. 之所以报这样 ...
- ip地址0.0.0.0与127.0.0.1的区别(转载)
原文链接:http://blog.csdn.net/ttx_laughing/article/details/58586907 最近在项目开发中发现一个奇怪的问题,当服务器与客户端在同一台机器上时,用 ...
- mac如何进入应用程序的内部文件夹?
在程序点击右键,选择显示包内容,就可以看到了
- 关于ZendStudio 10.5的破解 包括mac
一. 下载ZendStudio 10.5 首先下载ZendStudio 10.5 我使用的是mac版 下载地址是: http://downloads.zend.com/studio-eclipse/1 ...
- php数组根据某键值,把相同键值的合并最终生成一个新的二维数组
<?php $a=array( '0'=>array( 'id'=>'1', 'names'=>'jack', '0'=>'sendone' ), '1'=>arr ...
- SharePoint 2016 每天预热脚本介绍
使用SharePoint的朋友们应该知道,SharePoint每天夜里有自动回收的机制,使环境每天把占用的内存都释放出来,以确保不会累计占用过多内存导致服务器崩溃. 我们可以打开IIS,选中我们的应用 ...
- iOS 输入限制之 InputKit
前言 最近接手了两个 O2O 的老项目,其中的 Bug 也不言而喻,单看项目中的布局就有 n 种不同的方式,有用纯代码的,有用 Masonry 的,有用 VFL 的,也有用 Xib 的,更有用代码约束 ...