来自 Web 应用程序的连接池中大型“最大连接数”的缺点

jos*_*ing 8 sql-server connection-pooling

我知道如果您根本不池化数据库连接,那么每次需要查询数据库时,您都要承担建立新数据库连接的开销,这会使您的应用程序变慢,并且您可以通过池化来节省该开销。

如果您将最大池大小设置得太小 - 比方说,最多 1 个连接 - 那么它的缺点是您的应用程序必须为所有请求共享该单个数据库连接,并且请求将不得不等待前一个连接完成数据库连接,然后才能从池中获取它并重新使用它。

但是,如果您只是将最大池大小设置得非常大,例如最大 1000 个连接,该怎么办。那么它不应该更倾向于重用连接而不是建立新连接,并且仅在实际需要时才最大化池大小以满足需求吗?

假设未使用的连接在空闲超时后关闭/从池中删除,使连接池大于满足应用程序需求所需的大小有什么缺点?

Sea*_*ser 8

我知道如果您根本不池化数据库连接,那么每次需要查询数据库时,您都要承担建立新数据库连接的开销,这会使您的应用程序变慢,并且您可以通过池化来节省该开销。

通常,但这取决于......如果它是一个长期存在的进程或连接,则专用连接可以提高性能并减少开销。

如果您将最大池大小设置得太小 - 比方说,最多 1 个连接 - 那么它的缺点是您的应用程序必须为所有请求共享该单个数据库连接,并且请求将不得不等待前一个连接完成数据库连接,然后才能从池中获取它并重新使用它。

他们也可能会出错。我不会假设它会完美地复用。这就是为什么将最大值设置得太低会产生不利影响(也将它设置得太高!)。

但是,如果您只是将最大池大小设置得非常大,例如最大 1000 个连接,该怎么办。那么它不应该更倾向于重用连接而不是建立新连接,并且仅在实际需要时才最大化池大小以满足需求吗?

我想说,如果 1000 个并发连接不会破坏您的应用程序/数据库处理中的任何内容,那么就去做吧。实际上,除非此应用程序变得非常流行或应用程序/数据库中存在问题,否则不需要在同一应用程序服务器上的同一池中达到 1000 个并发请求。如果是,您可能会在数据库服务器之前终止应用服务器(可能不会,取决于硬件和配置),或者在数据库级别会出现一些并发问题(同样取决于)。

这将允许池增长,但希望不会压倒数据库服务器。如果你有 10 个应用服务器都设置为这个,那么 10k 连接可能是一个问题。即使在这个简单的例子中,也有很多活动部分,但我试图保持乐观。

假设未使用的连接在空闲超时后关闭/从池中删除,使连接池大于满足应用程序需求所需的大小有什么缺点?

缺点是你可以:

  • 压倒数据库
  • 压倒应用服务器
  • 建立/拆除连接的开销很高

最终连接将被删除和释放,但设置它们需要资源和时间。池的目的是重用这些资源以降低总体成本和资源使用。


Dan*_*man 7

默认最大池大小为 100,除非有特殊要求,否则通常应坚持使用。将最大连接池大小设置为高于此值意味着您可能同时对数据库进行如此多的查询,并加剧诸如长期阻塞或长时间运行的查询之类的问题。

未使用的池连接总是在创建新连接之前重用。如果在几分钟内没有重新使用,未使用的池连接也会被物理关闭,从而释放服务器端资源。


mus*_*cio 5

存在限制以防止失控的资源使用。如果您确信您的数据库可以在最高负载期间处理 1000 个并发连接(因为这正是池使用率最高的时候),并且您不会有另一个应用程序服务器同时运行,那么就没有将池大小设置为 1000 的危害。您实际上是在选择您想要陷入困境的内容——您的数据库服务器或您的应用程序服务器。