Java 提高过程的执行时间

Java 提高过程的执行时间,java,Java,我需要您的帮助,以便及时改进Java中的以下过程。 程序步骤如下: 我有一个超过一百万条记录的表(主键是自动递增) 我从此表中选择最小和最大主键值 我根据最小值和最大值创建了一些初始“fromRange”和“toRange”变量 创建循环后,每次处理20000条记录: 我从“fromRange”到“toRange”之间提取记录 对于每个记录返回,我都会写入(每次追加)一个XML对象(使用JAXB) 在我将在磁盘上的文件上创建的XML对象写入之后 增加“fromRange”和“toRange”以

我需要您的帮助,以便及时改进Java中的以下过程。 程序步骤如下:

  • 我有一个超过一百万条记录的表(主键是自动递增)
  • 我从此表中选择最小和最大主键值
  • 我根据最小值和最大值创建了一些初始“fromRange”和“toRange”变量
  • 创建循环后,每次处理20000条记录:

    我从“fromRange”到“toRange”之间提取记录

    对于每个记录返回,我都会写入(每次追加)一个XML对象(使用JAXB)

    在我将在磁盘上的文件上创建的XML对象写入之后

    增加“fromRange”和“toRange”以继续下一个记录

处理完所有记录后,程序结束

在普通PC上执行此操作需要12个多小时才能完成。我想知道如何改进这段代码 以更快地导出文件。也许使用线程

谢谢

我从“fromRange”到“toRange”之间提取记录

我从“fromRange”到“toRange”之间提取记录

是IO步骤,阻止计算。多线程是确保机器资源得到最佳利用的解决方案

当然,您应该自己分析这个问题,并看到线程经常被阻塞。如果是,则多线程是有效的。

注释:

  • 我有一个超过一百万条记录的表(主键是自动递增)
这是可以的,因为它是主键,它会自动为大多数DBMS建立索引

  • 我从此表中选择最小和最大主键值
您可以通过DMBS函数的第一行和最后一行执行此操作。那真的是有选择性的,不会花很长时间

  • 我根据最小值和最大值创建了一些初始“fromRange”和“toRange”变量
大多数现代DMB都可以将其索引保存为B*树。这意味着你有一个树结构,它能很快找到一个值,然后叶子通过一个链表链接起来,这样就可以很快找到一个值。因此,这也应该是有选择性的,不要花费太多时间

  • 创建循环后,每次处理20000条记录
我将尝试创建一个Java对象,并在最后通过JAXB进行序列化


一般来说,您需要进行一些跟踪,以查看哪一步占用了大部分时间。

并行完成所有工作肯定会更好。保持主线程从数据库中读取,但不读取所有记录,即按myId从MyTable中选择*

然后通过调用工厂中的一个方法(如
newCachedThreadPool
)来创建
ExecutorService

然后在主线程中,继续循环记录,并为每个记录发送
executor.submit(new Runnable(){doYourWork(record);},null)。注意
记录必须是副本,因为它将从不同的线程访问

在结束时调用
executor.shutdown()
executor.waittermination()
。您可以通过调用
submit
方法返回的
Future
s上的
get()
来检查潜在错误


<强>其他方式< /强>,如果您需要更高级的解决方案,您可以考虑使用<强> Apache CAMEL < /St>,具体地说。

< P>您的问题不完整:没有总计数,没有数据库类型,没有记录大小的信息。但总的来说:

  • 不要使用max/min-只需选择所有记录并对其进行迭代即可
  • 注意在JDBC中获取大小参数。这是你应该设置20000的地方
  • 在流模式下使用JAXB(请参阅)
  • 不要忘记Outputstream缓冲

  • 你有没有分析过它,看看是什么花了这么长时间?没有。我不知道这件事。我会检查的对象可能太大,无法放入内存。