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

时间:2018-09-30 03:10:09

标签: database multithreading parallel-processing

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

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

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

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

我真的很想弄清楚这一点,但是在网络研讨会期间我不能问这个。

谢谢!

1 个答案:

答案 0 :(得分:0)

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

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

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

一切都归结为您的设计有多好,这是非常具体的问题。