我应该如何多线程化与数据库对话的java脚本

时间:2013-03-07 02:51:18

标签: java mysql multithreading jdbc

这是我的脚本所做的:

它逐行解析拥有2700万行的文档。我拿出每一行,解析它,并将必要的信息插入数据库表(使用JDBC)。

问题是,preparedStatement.executeUpdate()方法不是异步的,所以它一直等到它返回,这就是我的瓶颈所在。解析2700万行需要大约2天时间:(

由于JDBC没有异步支持,我想在一个线程中包装每个executeUpdate()调用。我应该每次创建一个新线程吗?或者我应该使用线程池,我应该如何创建该线程池?

我担心由于线路的解析几乎不需要任何时间,因此在线程池中等待的活动任务数量将超过可用线程的数量,并且它将恢复为线性,瓶颈是任务等待开放的线程。

由于

1 个答案:

答案 0 :(得分:2)

  1. 创建一个具有固定线程数的执行程序(无论什么都能提供最佳性能)
  2. 创建一个最大尺寸的BlockingQueue,比如说100
  3. 向Executor提交所需数量的工作人员,每个人都有对BlockingQueue及其自己的Connection / PreparedStatement的引用
  4. 主线程解析BlockingQueue上的文件和put()
  5. 工作线程take()来自BlockingQueue的一行并更新数据库
  6. (这是一个基本的生产者/消费者多线程场景)