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 ...
随机推荐
- 平衡树初阶——AVL平衡二叉查找树+三大平衡树(Treap + Splay + SBT)模板【超详解】
平衡树初阶——AVL平衡二叉查找树 一.什么是二叉树 1. 什么是树. 计算机科学里面的树本质是一个树状图.树首先是一个有向无环图,由根节点指向子结点.但是不严格的说,我们也研究无向树.所谓无向树就是 ...
- [0] 自定义特性AttributeUsage
using System;using System.Collections.Generic;using System.Linq;using System.Text; namespace Fxframe ...
- jquery 实现滚动条下拉时无限加载的简单实例
var lastId=0;//记录每一次加载时的最后一条记录id,跟您的排序方式有关. var isloading = false; $(window).bind("scroll ...
- Linux基础命令之总结一
[root@ping ~]# tree -L 1 / #使用tree 命令查看根目录下的一层的目录结构 ls - list directory contents[root@ping ~]# ls ...
- linux服务器查看redis版本:
linux服务器查看redis版本:redis-server-v
- 【原创】Kafka Consumer多线程实例续篇
在上一篇<Kafka Consumer多线程实例>中我们讨论了KafkaConsumer多线程的两种写法:多KafkaConsumer多线程以及单KafkaConsumer多线程.在第二种 ...
- Spring Web 配置文件加载路径问题
Spring: 定位 载入 注册 我们常用的加载context文件的方法有如下三个: 1.FileSystemXmlApplicationContext 这个方法是从文件绝对路径加载配置文 ...
- http请求的完整过程
HTTP通信机制是在一次完整的HTTP通信过程中,Web浏览器与Web服务器之间将完成下列7个步骤: 1. 建立TCP连接 在HTTP工作开始之前,Web浏览器首先要通过网络与Web服务器建立连接,该 ...
- js动态增加秒数(自动,手动)
//获取当前的日期及时间Date var myDate = new Date(); myDate.getYear(); //获取当前年份(2位) myDate.get ...
- MySQL(二)--事务与视图
一.事务 1.提交 2.回滚 3.ACID特性 二.视图 1.创建视图 2.删除视图 3.更新视图 4.使用视图 三.子查询 1. 使用子查询 2. 标量子查询 3. 关联子查询 一.事务 在 RDB ...