【问题标题】:How should I multi-thread my java script that talks to a database我应该如何对与数据库对话的 java 脚本进行多线程处理
【发布时间】:2013-03-07 02:51:18
【问题描述】:

这是我的脚本的作用:

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

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

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

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

谢谢

【问题讨论】:

    标签: java mysql multithreading jdbc


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

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

    【讨论】:

    • 如何将worker提交给Executor?这是通过execute(Runnable)方法吗?理想情况下,我希望创建固定数量的可重复使用的工人,对吧?
    • 我创建了固定数量的worker(每个都实现runnable),它们的run方法有一个while(true)循环从阻塞队列中获取()。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-25
    • 1970-01-01
    • 2020-06-26
    • 1970-01-01
    • 2013-09-02
    • 2016-11-30
    相关资源
    最近更新 更多