使用与ExecutorService线程的常量连接

时间:2012-08-02 18:02:38

标签: multithreading jdbc executorservice

我有一项任务是创建一个独立的Java应用程序来执行以下操作:

  1. 解析.csv文件。 (这将有大约300万条记录)
  2. 对于每条记录,在几个DB表中插入~15行。
  3. 如果成功处理.csv记录,则输出。
  4. 我目前设计的想法是:

    1. 阅读.csv文件(尚未考虑此步骤)
    2. 为.csv中的每条记录创建工作/任务对象。将所有这些任务对象放在队列/列表中。
    3. 创建预定义数量的线程(旧学校,不使用Executor框架)
    4. 每个线程都有逻辑:

      1. 创建数据库连接。
      2. if(getNextJobFromList() != null)
        // Prepare and insert the statements in a batch update.
      3. 关闭数据库资源。
      4. 提供输出状态
      5. 时间是一个非常大的限制因素。

        现在问题:

        1. 我可以使用Executor框架加快速度吗?在我的伪代码中,线程在其生命周期内保持数据库连接。我可以在Executor框架中执行此操作吗?

        2. 还有其他方法可以优化吗?

        3. 提前致谢:)

1 个答案:

答案 0 :(得分:2)

您可以使用Executor执行此操作。这听起来不是一个好主意,你会用工作来压倒数据库,你的大多数线程都会花时间等待。

我认为你最好在数据库中进行批量导入(如果你使用的是Oracle,那么使用SQL * Loader,其他数据库也有类似的工具),不需要多线程。批量复制速度非常快,它可以关闭约束检查和索引修改,只是捏造数据。它比JDBC快几个数量级,如果你想要速度,你应该检查它。