1. 重构场景1: 导入大数据量的文本文件(记录数>10000).
性能分析: 系统要求能够接受xml, csv两类文件, 并且最后的处理统一按照xml来进行解析。由于系统架构的缘故, 目前是通过使用xslt将csv转换成xml文件。基本的过程是通过JAXB将xml结构解析成相应的对象, 然后调用统一的repository/domain操作, 将其插入数据库中. 从csv转换得到的xml文件需要从内存写入磁盘以便日后查询文件得到导入明细数据. 之前的结构在导入大数据量的csv文件时发现明显停滞. 经分析方法调用时间发现主要由于同一批次处理的csv文件记录过多(1000条), 而且由于生成的xml文件过大需要消耗更多的堆空间来处理对象的转换。
改进方案: 减小批次的记录(100~300), 对每个批次的处理使用单独的线程而不是顺序处理批次.
2. 示例代码
MessageReceiver类负责创建每个批次的具体执行线程。
class MessageReceiver implements Callable<Boolean> {
/** The messages. */
private List<Document> messages;
/** The processed file. */
private String file;
/** The parms. */
private Properties parms;
/**
* Instantiates a new message receiver.
*
* @param messages the messages
* @param file the processed file
* @param parms the parms
*/
public MessageReceiver (List<Document> messages, String file, Properties parms) {
this.messages = messages;
this.file = file;
this.parms = parms;
}
/**
* Call.
*
* @return the boolean
*
* @throws Exception the exception
*/
public Boolean call() throws Exception
{
try {
return addMessage();
} catch (Exception e) {
throw e;
}
}
/**
* Adds the message.
*
* @return true, if successful
*/
private boolean addMessage () {
messages.add(TransformDocument(file, parms));
return true;
}
}
receiveCSV 方法负责分解各个批次以及最后将各线程处理结果汇总计算。(省略关键业务逻辑, 只保留逻辑主干)
private List<Document> receiveCSV() {
// omit the subsidiary process
try
{
br = new BufferedReader(new FileReader(file));
String text = "";
while ((text = br.readLine()) != null)
{
fileContents.append(text + "\n");
recordsNum++;
if ((recordsNum % csvManageRecordNum) == 0)
{
String processedFile = getFileContent(fileContents);
Future<Boolean> result = threads.submit(new MessageReceiver(messages, file, parms));
results.add(result);
fileContents = new StringBuilder();
}
}
}
catch (FileNotFoundException e)
{
//
}
catch (IOException e)
{
//
}
finally
{
// omit the dispose process
}
if ((recordsNum % csvManageRecordNum) != 0)
{
String file = getFileContent(fileContents);
Future<Boolean> result = threads.submit(new MessageReceiver(messages, file, parms));
results.add(result);
}
// Using thread pool to execute simultaneously
try {
for (Future<Boolean> result : results) {
try {
result.get();
} catch (ExecutionException ee) {
throw new Exception(ee);
}
}
} catch (InterruptedException ie) {
throw new Exception(ie);
} finally {
threads.shutdown();
}
return messages;
}
分享到:
相关推荐
Concurrent.Thread.js 一个用来让javascript也进行多线程开发的包,感兴趣的快来下吧。
《并发编程:JavaScript中的Concurrent.Thread.js》 在IT领域,多线程编程是一种常见的优化技术,用于提高程序的执行效率。特别是在JavaScript这样的单线程环境中,由于其异步执行模型,多线程处理显得尤为重要。...
concurrent-1.3.4.jar
- copy %AXIS2_HOME%\lib\backport-util-concurrent-3.1.jar 到%ECLIPSE_HOME%\plugins\Axis2_Codegen_Wizard_1.3.0\lib - 注册此 jar 包: 編輯 %ECLIPSE_HOME%\plugins\Axis2_Codegen_Wizard_1.3.0\plugin.xml , ...
介绍了一个可以在JavaScript中应用多线程的库:Concurrent.Thread,内有多线程库脚本,以及使用说明和实例,如果查看详情,可以查看我的博客https://blog.csdn.net/hsl_1990_08_15/article/details/84765772
concurrent-1.3.2.ja
(1).关闭 Eclipse (2).copy %AXIS2_HOME%\lib\ 下的 backport-util-concurrent-3.1.jar 和 geronimo-stax-api_1.0_spec-1.0.1.jar 复制到 MyEclipse 6.5\eclipse\plugins\Axis2_Codegen_Wizard_1.3.0\lib 文件夹...
Principles.of.Concurrent.and.Distributed.Programming.chm
《深入解析Atlassian Util Concurrent库:0.0.12版本》 在IT行业中,高效且可靠的并发处理是系统性能优化的关键因素之一。Atlassian公司,以其强大的协作工具如Jira、Confluence等闻名,也提供了许多开源工具来支持...
Concurrent.and.Real.Time.Programming.in.Java.eBook-LiB.chm
CRC.Press.-.Creating.Components.-.Object.Oriented,.Concurrent,.and.Distributed.Computing.in.Java.-.2004.chm
AQS(AbstractQueuedSynchronizer)是Java.util.concurrent包中同步器的基础框架,它的核心设计思想与实现方法在Doug Lea先生的这篇论文中有详细的介绍。论文详细阐述了AQS框架的原理、设计、实现、应用以及性能等...
在Eclipse3.5用Axis2中创建wsdl文件时,在最后一步出现如下错误: An error ocCurred while ...解决用到的jar包,两个jar包在backport-util-concurrent-3.1.jar和geronimo-stax-api_1.0_spec-1.0.1.jar.zip的压缩文件中
concurrent.jar 里面有,使用Apache JCS 时候需要的EDU/oswego/cs/dl/util/concurrent/Channel ,编译 jcaptcha时候需要第EDU.oswego.cs.dl.util.concurrent.ClockDaemon类, concurrent-1.3.3.jar
本书《Concurrent Programming in Java - Design Principles and Patterns (Second Edition)》深入探讨了在Java编程语言中进行并发编程的方法、设计理念及其实现技巧。它假设读者已经具备面向对象编程的经验,但对于...
With the rise of multicore processors in the consumer market, the need for concurrent programming has overwhelmed the developer world. Where it once served to express asynchrony in programs and ...