gpt4 book ai didi

java - 数据库多线程插入(更新)和单线程顺序插入(更新)的性能比较?

转载 作者:行者123 更新时间:2023-11-29 04:05:41 33 4
gpt4 key购买 nike

让我们想象一个环境:有一个数据库客户端和一个数据库服务器。数据库客户端可以是 Java 程序或其他程序等;数据库服务器可以是mysql、oracle等。

需求是在数据库服务器上的一个表中插入大量记录。

最简单的方法是有一个循环,在这个循环中客户端每次插入一条记录,直到所有记录都被插入。这是单线程顺序插入。

还有另一种多线程并发插入方式,让客户端同时启动多个线程,每个线程向表中插入一条记录。直觉上,因为这些记录是独立的,并且假设现代数据库服务器带有 RAID,其中并发 IO 得到很好的支持,它们似乎能够为多个插入获得实际和真正的并发,因此,这种方式可以改进性能,与上述方法相比。

然而,当我深入了解更多细节后,我发现情况可能并非如此。此链接 -- Multi threaded insert using ORM?说在同一张表上插入需要对整个表上的每一次写入进行锁定。因此,每个插入只是阻塞另一个后续插入,最终,这种方式只是另一种类型的顺序多次插入,根本没有性能提升。

我的问题如下:

  1. 为什么大多数数据库都这样处理同一个表上的多线程插入?
  2. 为什么必须在整个表上插入锁?
  3. 多线程更新是否与多线程插入类似?

尽管看起来处理大量插入的最好方法是启用批量插入,但我仍然很好奇在插入发生时锁定整个表的理由。

提前致谢!

============================================= ======================

经过大量阅读和研究,事实证明我的问题实际上是错误的。真正的事情是一个插入不会同时阻塞另一个插入。(至少对于 Oracle 是这样)。

最佳答案

此答案需要了解数据库,这超出了此处简单答案的范围。由于您询问有关 Oracle 的信息:

Oracle 并不像您认为的那样锁定整个表。在插入过程中,本质上是表结构的锁(即,有人不能在插入中删除列),但在数据级别,没有锁。这意味着您可以在单个表上进行多个并发插入。更新(在 Oracle 中)是类似的。然而,在这种情况下,正在更新的数据上有一个行锁。所以你可以在同一张表上有很多并发更新;但不在同一行。

话虽如此,多线程插入不是加载大量数据的方式。为此,Oracle 提供了一种替代方法,即直接路径加载。在这种方法中,我们加载行集,而不是逐行加载(缓慢加载)。并不是单个插入速度慢,而是速度慢。恰恰相反,它们非常快。但即使每次插入 0.1 毫秒,当您必须加载 1 亿行时,也就是 2.7 小时!基于集合的方法允许数据库执行并行性,而不是手动的“本土”多线程方法因此,为了让您了解可以 做什么,我在大约 10 分钟内加载了大约 60 亿行(大约 1 TB 数据)。最后,数据加载通常受 CPU 限制;不受 IO 限制。

关于java - 数据库多线程插入(更新)和单线程顺序插入(更新)的性能比较?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42708374/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com