1

这是我的脚本的作用:

它逐行解析包含 2700 万行的文档。我对每一行进行解析,然后将必要的信息插入到数据库表中(使用 JDBC)。

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

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

我担心由于解析行几乎不需要任何时间,线程池中等待的活动任务数量将超过可用线程的数量,它会回到线性,瓶颈是等待打开的任务线程。

谢谢

4

1 回答 1

2
  1. 创建一个具有固定线程数的 Executor(以提供最佳性能的方式)
  2. 创建一个最大大小的 BlockingQueue,比如 100
  3. 向 Executor 提交所需数量的工作人员,每个工作人员都有对 BlockingQueue 的引用和他们自己的 Connection/PreparedStatement
  4. 主线程解析put()BlockingQueue 上的文件和行
  5. 工作线程take()从 BlockingQueue 中提取一行并更新数据库

(这是一个基本的生产者/消费者多线程场景)

于 2013-03-07T03:00:29.490 回答