DB连接没有活动连接?

时间:2011-09-14 03:03:32

标签: spring connection

我只是想问一下连接池是如何工作的。据我所知,当需要数据库访问时,将从池中获取连接。连接池也有最大连接限制(取决于开发人员指定的内容),在我的情况下我没有指定任何,但是当我打印最大活动连接时它是8,所以最大空闲等待时间-1。我相信这是默认值,因为我没有指定任何内容。

我想知道的原因是因为我在春天维护一个系统,并且它为一次交易更新数据库两次(它设计用来做)。我打印了最大活动数和空闲数,这个数字实际的活跃和空闲。结果如下:

*第一次更新

  1. max active:8 max idle:8 max wait:-1
  2. num idle:1且active:0 *未从池中提取con
  3. num idle:0和active:1 * con with dataSource.getConnection()
  4. *第二次更新

    1. max active:8 max idle:8 max wait:-1
    2. num idle:0且active:0
    3. num idle:0且active:0
    4. 所以我想知道,如果第二次更新没有活动连接,那么池中的连接是否与数据库的连接不同?

      我对此并不是那么了解,我将非常感谢您的指导和时间。

1 个答案:

答案 0 :(得分:0)

非池化连接的请求相当重要:您必须创建一个新连接,使用它并关闭它。

连接池消除了大部分开销,因为大多数请求不会产生创建连接的成本(连接管理中最重的部分)或关闭它的成本。但是,对数据库的每个请求都将使用连接(因此您的第二个更新肯定是使用连接)。所有池都代表您为您创建连接,并允许您重用它们 - 因此“数据库连接”和“池连接”实际上是相同的。

通常,您使用最少的连接数配置池。例如,您可以将其配置为始终至少具有五个连接。当您的应用程序启动时,池将在任何请求进入之前分配这些连接。当每个请求进入时,池将贷出已打开的连接以供请求使用。使用连接完成后,应该通过借用它的代码将其返回到池中。如果您的应用程序有许多并发请求,则可能会耗尽连接。这是连接池上的其他策略的用武之地。

通常有一个设置,用于在连接用完时将所做的操作(所有连接都借出到请求),例如“创建1个更多连接”或“创建5个更多连接”。因此,如果只有5个池连接并且第六个并发请求进入,则在池创建一个或多个其他连接时可能会产生一些成本。但是,一旦创建,您现在拥有一个已经发展到可以快速容纳在繁忙时段提供大量连接的池。

同样,如果进入的请求数量减慢(可能是它的夜晚),您现在可能会在池中放置一堆空闲连接。池通常具有可配置的策略,用于处理空闲连接。例如,您可能会说池中只需要最多5个空闲连接,并且如果连接在最近5分钟内未使用,则认为连接处于“空闲”状态。然后,池将关闭连接以将池缩小到更小的大小,从而释放不需要的资源。

您可以设置的另一个策略是允许池拥有的最大连接数。在您的示例中,您将此设置为8.这意味着无论您的应用程序多忙,您将永远不会允许超过8个并发数据库请求。这是另一个策略的用武之地:当用完连接并且不允许扩展池时该怎么做。通常,池提供了多种选择,例如“等待免费连接”,“建立更多连接”,“抛出异常”等等。由于您的示例的“最大等待时间”为-1,因此必须表示默认值为你的游泳池是等待连接的时间(假设-1表示“永远”)。根据您的应用程序,这可能是一个好的或坏的选择。

一般情况下,我认为随着时间的推移,您会监控请求的持续时间,您在任何时间有多少连接等,并调整您的池设置是最有效的,即最小化创建/借用连接的等待时间,最小化为连接分配的资源数量,并快速响应不断变化的请求模式。

最后,关于您的问题,如果您的池配置为积极关闭连接,则可以有0个空闲和0个活动连接。尝试设置最小池大小以增加此值。