我希望得到您的帮助,以便及时改进Java中的以下过程。 程序步骤如下:
创建循环后,每次处理20000条记录:
我在' fromRange'之间取得了记录。直到' toRange'
对于每个记录返回,我写(每次附加)到XML对象(使用JAXB)
在我写入在磁盘上的文件上创建的XML对象之后。
增加' fromRange'和' toRange'继续下一个记录。
在所有记录处理完毕后,程序结束。
此执行在普通PC上完成需要12个多小时。我想知道如何改进这段代码 更快地导出文件。也许使用线程?
由于
答案 0 :(得分:0)
我在' fromRange'之间取得了记录。直到' toRange'
和
我在' fromRange'之间取得了记录。直到' toRange'
IO步骤,阻止计算。多线程是确保以最佳方式使用机器资源的解决方案。
当然,您应该自己对此进行分析,并发现线程在很多时候都被阻止了。如果是,是的,多线程有效。
答案 1 :(得分:0)
评论:
没关系,因为它是主键,它自动成为DBMS的大部分索引。
您可以通过DMBS功能的第一行和最后一行执行此操作。那是非常有选择性的,不应该花很长时间
大多数现代DMBS可以将其索引保存为B *树。这意味着你有一个树结构,它可以非常快速地找到一个值,然后通过一个链表来链接叶子,这样就可以快速找到愤怒。所以这也应该是有选择性的,不要花太多时间。
我会尝试创建一个Java对象,最后通过JAXB进行序列化。
一般来说,你需要做一些追踪,看看哪个步骤大部分时间消耗。
答案 2 :(得分:0)
并行完成所有工作肯定会更好。保持主线程从数据库中读取所有记录,即select * from MyTable order by myId
。
然后通过调用Executors
工厂中的一种方法创建ExecutorService
,如newCachedThreadPool
。
然后在主线程中继续循环记录,并为每个记录发送executor.submit(new Runnable() { doYourWork(record); }, null);
。请注意record
必须是副本,因为它将从不同的线程访问!
最后致电executor.shutdown()
和executor.awaitTermination()
。您可以通过调用get()
方法返回的Future
上的submit
来检查潜在错误。
另一种方式,如果您需要更高级的解决方案,可以考虑使用 Apache Camel ,特别是SQL example。
答案 3 :(得分:0)
您的问题不完整:没有总计数,没有数据库类型,没有关于记录大小的信息。但总的来说: