[英]Tutorial about Using multi-threading in jdbc
我们公司有一个每天运行的批处理应用程序,它主要做一些与数据库相关的工作,例如从文件导入数据到数据库表。
该应用程序中定义了20多个任务,每个任务可能依赖于其他任务。 应用程序逐个执行任务,整个应用程序在单个线程中运行。
完成所有任务需要3~7个小时。 我认为它太长了,所以我想也许我可以通过多线程提高性能。
我认为由于任务之间存在依赖关系,因此并行运行任务并不好(或者说并不容易),但也许我可以使用多线程来提高任务内部的性能。
例如:我们有一个定义为“ImportBizData”的任务,它将数据从数据文件复制到数据库表中(通常包含100,0000多行)。 我想知道是否值得使用多线程?
正如我对多线程知之甚少,我希望有人提供一些关于这个主题的教程链接。
多线程将提高您的性能,但您需要了解以下几点:
commit
一次,以避免累积大量的回滚/撤消表。 详细说明最后一点:目前,您有一个任务,它可以读取文件,解析它,打开JDBC连接,进行一些计算,将数据发送到数据库等。
你应该做什么:
第一个和最后一个线程非常慢,因为它们受I / O限制(硬盘速度慢,网络连接更糟)。 在数据库中插入数据是一项非常复杂的任务(分配空间,更新索引,检查外键)
使用不同的工作线程可以提供很多优势:
多线程可能有所帮助,如果线路不相关,您可以开始两个进程,一个读取偶数行,另一个不均匀的行,并从连接池(dbcp)获取数据库连接并分析性能。 但首先我要调查jdbc是否是最好的方法,通常数据库已经为这样的导入优化了解决方案。 这些解决方案还可以临时切换对表的约束检查,并在以后将其重新打开,这对性能也很有帮助。 一如既往地视您的要求而定。
您也可以查看专为批处理设计的弹簧批量。
我有类似的任务 。 但就我而言,所有表格都是彼此无关的。
第1步:使用SQL Loader(Oracle)将数据上传到数据库(非常快)或任何类似的数据库批量更新工具。
第2步:在不同的线程(针对不相关的任务)和单个线程中运行每个上载过程以执行相关任务。
PS您可以在应用程序中识别不同的相互关联的作业,并将它们分组; 并在不同的线程中运行每个组。
运行你的链接:
JAVA线程遵循上面链接中的最后一个示例(示例:使用多个线程对大型任务进行分区)
我发现将大量记录插入Oracle的最快方法是使用数组操作。 请参阅“setExecuteBatch”方法,该方法特定于OraclePreparedStatement。 它在这里的一个例子中描述: http : //betteratoracle.com/posts/25-array-batch-inserts-with-jdbc
如果多线程会使您的工作复杂化,您可以使用Async消息传递。 我不完全清楚你的需求是什么,所以,以下是我目前所看到的。
您不必在整个过程中处理线程,JMS是理想的,因为您的数据在事务中,如果在您向服务器发送确认之前某些事情失败,则消息将重新发送给消费者,负载将被分割服务器之间没有你做任何特殊的事情,如多线程。
此外,春天提供春季批次,可以帮助您。 http://docs.spring.io/spring-batch/reference/html/spring-batch-intro.html#springBatchUsageScenarios
据我所知,JDBC Bridge使用同步方法序列化对ODBC的所有调用,因此使用mutliple线程不会给你任何性能提升,除非它提升你的应用程序本身。
我不是那么熟悉JDBC,但是关于你的问题的多线程位,你应该记住的是并行处理依赖于有效地将你的问题分成彼此独立的位,并以某种方式将它们重新组合在一起(他们的输出是)。 如果你不知道任务之间的潜在依赖关系,你可能最终会在代码中出现奇怪的错误/异常。 更糟糕的是,它可能都没有任何问题地执行,但结果可能与真实值不同。 多线程是一项棘手的业务,在某种程度上有趣的学习(至少我是这么认为),但当事情向南发展时,脖子上会感到痛苦。
以下是一些可能有用的链接:
如果你认真考虑进入多线程,我可以推荐GOETZ,BRIAN:JAVA CONCURRENCY,真是太棒了......
祝好运
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.