java - 我应该如何对与数据库对话的 java 脚本进行多线程处理

标签 java mysql multithreading jdbc

这是我的脚本的作用:

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

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

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

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

谢谢

最佳答案

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

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

关于java - 我应该如何对与数据库对话的 java 脚本进行多线程处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15262187/

相关文章:

c# - 在 Eclipse Juno 中使用 Axis 1.1

java - HttpClient 4.1 并不总是返回主机值

java - 使用 GridBagLayout 调整大小不当

javascript - 处理日期对象 javascript 与 java

mysql - 提高sql连接计数查询的性能

c# - StreamWriter 多线程 C#

mysql - GREATER THAN 过滤器在使用 MySQL.EXE(命令行)的 WHERE 子句中不起作用

mysql - Galera 比独立版慢 3 倍,具有持久设置、高 CPU 空闲率

Java:while 循环中的 For 循环不会运行,除非包含 println 语句

java - Spring 异步和分时度假