访问数据库:每个用户的进程、每个用户的线程和共享池



在网络研讨会期间,我听说有三种方法可以为许多用户访问数据库:

  1. 使用每个用户的进程
  2. 每个用户的线程数
  3. 和进程池

讲师说,每个用户的过程避免了处理并行化/锁定/等的需要,但过于繁重和复杂。每个用户的线程是轻量级的,但需要大量的锁定开销。访问数据库时,进程池具有共享的数据结构。

我不清楚的是 - 用户不是总是访问相同的数据结构,无论我们有进程、线程还是轮询 - 我们仍然需要实现锁定?为什么进程不需要锁定?每个用户的进程和进程池之间的区别是什么?正如讲师所说 - 共享数据结构。但是,如果进程不共享数据库,这意味着什么?假设我们在每个用户的情况下都在处理数据库,是否为每个用户复制数据库?

我真的很想澄清这一点,但我无法在网络研讨会期间问这个问题。

谢谢!

仅当您有一些共享资源时,才需要锁定。连接到数据库时,首先创建一个连接对象,然后通过该对象连接并发送查询。MySQL innoDb数据库执行行级别锁定,而不是锁定整个表。因此,如果多个进程尝试访问不同的行,则不需要锁定。

来到Threads,人们主要做的是创建一个连接池,多个threads访问该池。假设您有 50 个线程和包含 5 个对象的连接池。现在所有 50 个线程都无法访问这 5 个连接对象,他们需要等待连接对象空闲,一旦空闲,他们就可以使用连接对象来触发查询。线程共享相同的内存空间,因此大多数共享资源都必须是线程安全的

由于进程的创建非常繁重,因此您可能希望在 4gb 计算机上最多保留 10-20 个进程。但是线程的创建成本较低,您可以大量使用它们(~50(。因此,如果没有可共享的线程将提供更多的并行性。

同样,一切都归结为您的设计有多好,这是非常特定于问题的。

最新更新