sách gpt4 ai đã đi

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

In lại 作者:行者123 更新时间:2023-11-29 04:05:41 33 4
mua khóa gpt4 Nike

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

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

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

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

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

我的问题如下:

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

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

Cảm ơn trước nhé!

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

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

1 Câu trả lời

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

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

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

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

33 4 0
行者123
Hồ sơ cá nhân

Tôi là một lập trình viên xuất sắc, rất giỏi!

Nhận phiếu giảm giá Didi Taxi miễn phí
Mã giảm giá Didi Taxi
Giấy chứng nhận ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com