当前位置: 首页 > 面试题库 >

关于在jdbc中使用多线程的教程

孟鹤龄
2023-03-14
问题内容

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

该应用程序中定义了20多个任务,每个任务可能取决于其他任务。应用程序一个接一个地执行任务,整个应用程序在单个线程中运行。

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

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

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

据我对多线程的了解,我希望有人提供有关此主题的一些教程链接。


问题答案:

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

  1. 每个线程都需要自己的JDBC连接。无法在线程之间共享连接,因为每个连接也是事务。
  2. 分批上载数据,不时上载commit以避免累积大量的回滚/撤消表。
  3. 将任务分为几个工作单元,每个单元执行一项工作。

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

您应该做什么:

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

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

使用不同的工作线程有很多优点:

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


 类似资料:
  • 问题内容: 我想学习有关Javaagents的知识,但是研究并不容易。结果大部分是指。我知道Java代理可以表示两件事: 用Java编程的代理是分布式系统的代理概念的化身。 用于增强JVM工作的底层软件组件,例如探查器,代码覆盖工具等。 我在这里找到了类似的问题,但不幸的是,它也涉及版本1。 您是否了解任何有关版本2中的javaagent的文章,初学者教程和示例项目?我在这里找到了,但我正在寻找更

  • 问题内容: 按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实,参考或专业知识的支持,但是这个问题可能会引起辩论,争论,民意调查或扩展讨论。如果您认为此问题可以解决并且可以重新提出,请访问帮助中心以获取指导。 8年前关闭。 有人可以指出好的教程/书籍来学习如何在Android中使用/配置Hibernate吗? 问题答案: AFAIK,Hibernate在Android上不起作用。H

  • 本文向大家介绍Java多线程中关于join方法的使用实例解析,包括了Java多线程中关于join方法的使用实例解析的使用技巧和注意事项,需要的朋友参考一下 先上代码 新建一个Thread,代码如下: 之后新建测试类,代码如下: 下面是Java Platform SE8 API中对Thread中Join方法的解释: 先上代码 新建一个Thread,代码如下: 之后新建测试类,代码如下: 下面是Jav

  • 本文向大家介绍python中的多线程实例教程,包括了python中的多线程实例教程的使用技巧和注意事项,需要的朋友参考一下 本文以实例形式较为详细的讲述了Python中多线程的用法,在Python程序设计中有着比较广泛的应用。分享给大家供大家参考之用。具体分析如下: python中关于多线程的操作可以使用thread和threading模块来实现,其中thread模块在Py3中已经改名为_thre

  • 主要内容:读者,前提条件,先决条件,JDBC架构,常见的JDBC组件:,JDBC 4.0软件包,问题反馈JDBC API是一个Java API可以访问任何类型的数据库的数据,尤其是存储在关系数据库中的数据。 JDBC的工作原理与Java在各种平台一样,如Windows,Mac OS和各种版本的UNIX系统。 读者 本教程是为Java程序员设计的,需要了解JDBC框架的细节以及它的架构和实际使用情况。 前提条件 在学习本教程,应该对Java编程语言的一个很好的理解。因为要处理RDBMS,所以它需要

  • 所以我试图从另一个类开始一个服务类。这里是代码... 当上面的代码运行时,我的服务类在后台运行,而我被带回ujk类(这完全没问题)。在abcservice类中的onStart(Intent意图,int starId)方法内部,我正在以以下方式运行一个线程... 下面是onDestroy()方法。。 现在在日志中我得到以下输出。。。 我的疑问是... 1.这是正确的输出吗?我的意思是,如果服务在线程