繁体   English   中英

多线程文件处理和数据库批处理插入

[英]Multi-threaded file processing and database batch insertions

我有一个Java主应用程序,它将逐行读取文件。 每行代表订户数据。

name, email, mobile, ...

为要处理的每一行创建一个订户对象,然后使用JDBC将其保留在数据库中。

PS:输入文件包含大约1500万订户数据,处理应用程序大约需要10-12个小时。 我需要将其减少到2-3小时左右,因为此任务是一项迁移活动,而停机时间大约是4-5小时。

我知道我需要使用多个线程/线程池可能是Java的本机ExecuterService。 但是我也被要求做一个批量更新。 假设采用50个或100个工作线程的线程池,以及500-1000个订阅者的批量更新。

我对ExecuterService很熟悉,但没有找到一种可以在其中添加批处理更新逻辑的方法。

我的整体应用程序代码如下:

while (null != (line = getNextLine())) {
    Subscriber sub = getSub(line); // creates subscriber object by parsing the line
    persistSub(sub); // JDBC - PreparedStatement insert query executed
}

需要知道一种方法,在该方法中我可以使用多个线程并使用批处理更新或可用于此类情况的任何现有框架或Java API来更快地处理它。

persistSub(sub)不应立即访问数据库。 相反,它应该将sub存储在长度为500-1000的数组中,并且仅在该数组已满或输入文件终止时才将其包装在Runnable并提交到线程池。 然后, Runnable通过jdbc访问数据库,就像在JDBC Batching with PrepareStatement Object中描述的那样。

更新

如果写入数据库的速度很慢并且输入文件的读取速度很快,则可以创建许多包含数据的阵列,等待写入数据库,并且系统可能会用尽内存。 因此, persistSub(sub)应该跟踪分配的数组数。 最简单的方法是使用允许数量的数组进行信号量化的信号量 在分配新数组之前, persistSub(sub)创建Semaphore.aquire() 每个Runnable任务在结束之前都会生成Semaphore.release()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM