Kis*_*ore 3 java db2 multithreading
如何加速Java应用程序?
我正在开发一个Java应用程序,它逐行解析Cobol文件,从中提取必要的数据并填充到DB2数据库中.
如果要解析的文件更多,那么应用程序需要超过24小时才能完成,这是不可接受的.
所以我在一个单独的线程中做一些表格填充以加速...例如
ArrayList list = (ArrayList)vList.clone();
ThreadPopulator populator = new ThreadPopulator(connection, list, srcMbr);
Thread thread = new Thread(populator);
thread.run();
return;
And ThreadPopulator class is implementing Runnable interface and run method as
public void run()
{
try
{
synchronized (this)
{
int len = Utils.length(list);
for (int i = 0; i < len; i++)
{
.....
stmt.addBatch();
if ((i + 1) % 5000 == 0)
stmt.executeBatch(); // Execute every 5000 items.
}
}
}
catch (Throwable e)
{
e.printStackTrace():
}
finally
{
if (list != null)
list.clear();
}
}
Run Code Online (Sandbox Code Playgroud)
注意:需要使用clone,以便下一个线程不能消失条目.
我是否以正确的方式思考?
请建议我,我有多少选择加速我的应用程序超过成千上万的Cobol文件.
你需要首先确定它花费大部分时间做什么.这需要测量CPU和可能的内存使用情况.它是使用CPU的解析,还是使用IO的数据库.
如果不衡量您的性能瓶颈,就无法做出明智的决定,需要改进哪些方面.
根据我的经验,我会先怀疑数据库.批量大小为5000,应该足够了.程序运行时使用了多少CPU,例如一个CPU总是忙吗?
注意:您可以编写一个简单的文本解析器来读取大约40-100 MB/s.要运行24小时,您需要加载许多TB数据,这听起来不太可能.
实际上首先需要以适当的格式重写文件然后读取那些行并提取必要的数据,甚至是单个文件读取2-3次的源行(实际上这是逻辑部分).当我在4000K文件上运行应用程序时,它运行24小时.
400万个文件将成为性能问题.对于快速硬盘而言,即使是一个简单的文件打开也需要大约8毫秒,如果你打开2-3次,它总共需要大约30个小时.(我假设您的磁盘缓存可以节省几个小时)使速度更快的唯一方法是:
注意:使用更多线程不会使您的硬盘更快.