这是我的脚本的作用:
它逐行解析一个包含 2700 万行的文档。我获取每一行,对其进行解析,然后将必要的信息插入到数据库表中(使用 JDBC)。
问题是,preparedStatement.executeUpdate() 方法不是异步的,所以它一直等到它返回,这就是我的瓶颈所在。解析 2700 万行大约需要 2 天 :(
由于 JDBC 不支持异步,我想将每个 executeUpdate() 调用包装在一个线程中。我应该每次都创建一个新线程吗?或者我应该使用线程池,我应该如何创建线程池?
我担心由于解析行几乎不需要任何时间,线程池中等待的 Activity 任务的数量将超过可用线程的数量,它会回到线性,瓶颈是任务等待打开的线程。
谢谢
最佳答案
- 创建一个具有固定线程数的执行器(任何提供最佳性能的线程)
- 创建一个最大大小的 BlockingQueue,比如 100
- 向Executor提交所需数量的worker,每个worker都有一个对BlockingQueue的引用和他们自己的Connection/PreparedStatement
- 主线程解析 BlockingQueue 上的文件和
put()
行 - 工作线程
take()
BlockingQueue 中的一行并更新数据库
(这是一个基本的生产者/消费者多线程场景)
关于java - 我应该如何对与数据库对话的 java 脚本进行多线程处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15262187/