我目前正在编写一个多线程应用程序,需要访问数据库才能提供请求.我看到很多人说使用许多持久数据库连接的池是这种类型的应用程序的方法,但我试图解决为什么会出现这种情况.
请记住,我正在Erlang中设计此应用程序,因此我将大量使用线程/进程/工作程序.
那么让我们比较两种情况:
您有一个拥有单个数据库连接的线程.所有客户端处理线程都与此线程通信以进行数据库查询.
您有一个线程池,每个线程都有自己的数据库连接.当客户端处理线程想要访问数据库时,它从池中获取其中一个线程,并使用它来查询数据库.
在第一种情况下,我看到很多人说它很糟糕,因为让一个线程处理所有与数据库相关的查询反过来会导致瓶颈.但我的困惑如下:那个单线程中的瓶颈实际上不是数据库本身吗?如果线程正在做的就是通过其连接句柄查询数据库,是不是在等待DB响应请求的主要延迟源?如何在这个问题上抛出更多的连接线程来解决它?
数据库可能具有良好的多线程能力.使用连接池允许:
利用DB的多线程/负载平衡能力
避免一次又一次地设置和拆除连接的开销
当数据库为多个连接提供服务时,它可以自行决定如何确定请求的优先级.想象一下这种情况:
用户A请求表A中的一组记录,包含100,000行
用户B从表B请求50行的一组记录
用户C更新表A.
如果使用多个连接,则DB可以利用(1)和(2)可以同时发生的事实,并且用户B获得他的50个记录而无需等待用户A获得他的全部100,000个.只有用户C必须等待用户A完成.
此外,设置和拆除TCP连接是一项相对昂贵的任务.使用池允许一个用户在不拆除TCP连接的情况下释放资源,因此下一个用户不必等待新连接.但是,您的单线程方法不会受益于连接池的这一方面.