关于在jdbc中使用多线程的教程

Cai*_*der 16 java multithreading jdbc

我们公司有一个每天运行的批处理应用程序,它主要做一些数据库相关的工作,例如从文件导入数据到数据库表.

该应用程序中定义了20多个任务,每个任务可能依赖于其他任务.应用程序逐个执行任务,整个应用程序在单个线程中运行.

完成所有任务需要3~7个小时.我认为它太长了,所以我想也许我可以通过多线程提高性能.

我认为由于任务之间存在依赖关系,因此并行运行任务并不好(或者说并不容易),但也许我可以使用多线程来提高任务内部的性能.

例如:我们有一个定义为"ImportBizData"的任务,它将数据从数据文件复制到数据库表中(通常包含100,0000多行).我想知道是否值得使用多线程?

正如我对多线程知之甚少,我希望有人提供一些关于这个主题的教程链接.

Aar*_*lla 21

多线程将提高您的性能,但您需要了解以下几点:

  1. 每个线程都需要自己的JDBC连接.线程之间不能共享连接,因为每个连接也是一个事务.
  2. 以块为单位上传数据并commit偶尔上传,以避免累积大量回滚/撤消表.
  3. 将任务分成几个工作单位,每个单位完成一项工作.

详细说明最后一点:目前,您有一个任务,它可以读取文件,解析它,打开JDBC连接,进行一些计算,将数据发送到数据库等.

你应该做什么:

  1. 一个(!)线程来读取文件并从中创建"作业".每份工作都应该包含一个小而不是太小的"工作单元".将它们推入队列
  2. 下一个线程等待队列中的作业并进行计算.当步骤#1中的线程等待慢速硬盘返回新的数据行时,可能会发生这种情况.此转换步骤的结果将进入下一个队列
  3. 一个或多个通过JDBC上传数据的线程.

第一个和最后一个线程非常慢,因为它们受I/O限制(硬盘速度慢,网络连接更糟).在数据库中插入数据是一项非常复杂的任务(分配空间,更新索引,检查外键)

使用不同的工作线程可以提供很多优势:

  1. 分别测试每个线程很容易.由于它们不共享数据,因此无需同步.队列将为您做到这一点
  2. 您可以快速更改每个步骤的线程数以调整性能


dr *_*rry 5

多线程可能有所帮助,如果线路不相关,您可以开始两个进程,一个读取偶数行,另一个不均匀的行,并从连接池(dbcp)获取数据库连接并分析性能.但首先我要调查jdbc是否是最好的方法,通常数据库已经为这样的导入优化了解决方案.这些解决方案还可以临时切换对表的约束检查,并在以后将其重新打开,这对性能也很有帮助.一如既往地视您的要求而定.

您也可以查看专为批处理设计的弹簧批量.