java - jdbc多线程使用教程

标签 java multithreading jdbc

我们公司有一个每天运行的批处理应用程序,它主要做一些与数据库相关的工作,例如将数据从文件导入数据库表。

该应用程序中定义了 20 多个任务,每个任务都可能依赖于其他任务,也可能不依赖其他任务。 应用程序一个接一个地执行任务,整个应用程序在一个线程中运行。

完成所有任务需要 3~7 个小时。我觉得它太长了,所以我想也许我可以通过多线程来提高性能。

我认为由于任务之间存在依赖性,使任务并行运行并不好(或者不容易),但也许我可以使用多线程来提高任务内部的性能。

例如:我们有一个定义为“ImportBizData”的任务,它将数据从数据文件(通常包含 100,0000 多行)复制到数据库表中。我想知道是否值得使用多线程?

由于我对多线程了解不多,我希望有人提供一些关于这个主题的教程链接。

最佳答案

多线程将提高您的性能,但您需要了解以下几点:

  1. 每个线程都需要自己的 JDBC 连接。不能在线程之间共享连接,因为每个连接也是一个事务。
  2. 以 block 的形式上传数据并时不时提交,以避免累积巨大的回滚/撤消表。
  3. 将任务分成几个工作单元,每个单元只做一项工作。

详细说明最后一点:目前,您有一个读取文件、解析文件、打开 JDBC 连接、进行一些计算、将数据发送到数据库等的任务。

你应该做什么:

  1. 一个(!)线程读取文件并从中创建“作业”。每个工作都应该包含一个小的但不能太小的“工作单元”。将它们插入队列
  2. 下一个线程等待队列中的作业并进行计算。这可能发生在步骤#1 中的线程等待慢速硬盘返回新数据行时。此转换步骤的结果进入下一个队列
  3. 一个或多个线程通过 JDBC 上传数据。

第一个和最后一个线程非常慢,因为它们受 I/O 限制(硬盘很慢,网络连接更差)。加上在数据库中插入数据是一项非常复杂的任务(分配空间、更新索引、检查外键)

使用不同的工作线程会给您带来很多好处:

  1. 单独测试每个线程很容易。由于它们不共享数据,因此您不需要同步。队列会为你做到这一点
  2. 您可以快速更改每个步骤的线程数以调整性能

关于java - jdbc多线程使用教程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7186596/

相关文章:

java - 确定图的顶点的函数

java - 在 JTabbedPane 中设置背景图像

java - 如何在JSP中声明int变量?

java - 从 Java 调用的 SQL Server 中的表变量问题

java - 为我的项目选择父类(super class)

C++ Builder,TIdTCPServer 的多线程处理

C++ 是否有任何线程安全的组件可以写入(比没有锁的线程安全类似物更快)?

java - jdbc。 sql中preparedStatement递增值

java.sql.SQLException : MONTH

java - 如何在一个线程中读取SocketChannel,并从n个线程中写入?