Tomcat连接池中的maxActive和maxIdle有什么区别?

43
汤姆猫连接池有两个设置,分别为maxActive和maxIdle。我的问题是:
  1. 这两个设置之间有什么区别?
  2. 在什么实际情况下,您可能会为maxActive和maxIdle设置不同的值?
由于文档不太好理解,根据http://tomcat.apache.org/tomcat-7.0-doc/jdbc-pool.html 的文档,maxActive和maxIdle同样存在于Apache DBCP和Tomcat 7 JDBC Pool中。

maxActive (int):该池可以同时分配的活动连接的最大数量。默认值为100

maxIdle (int):应始终保留在池中的连接的最大数量。默认值为maxActive:100。空闲连接定期进行检查(如果启用),并且已空闲时间超过minEvictableIdleTimeMillis的连接将被释放。(还请参见testWhileIdle)

4个回答

44

maxActive很简单。maxIdle可以这样解释——假设你有100个最大活动连接,并且将maxIdle设置为80。如果没有请求发送到数据库,那么只有80个连接将通过验证查询进行测试并保持活动状态。其他20个将会被关闭。因此,在任何时刻,您只能拥有80个空闲连接。
您可能希望将其设置为不同的数字,以防止额外的(不必要的)连接发送到数据库。因为每个由数据库提供服务的连接都会消耗资源(如内存)。
但是,假设您已将maxActive大小设置为100,并且几乎所有时间都使用了全部100,则此设置显然无关紧要。


2
当你写80个连接将被测试时,你是什么意思?为什么另外20个会被关闭?我不明白maxActive有什么好处。 - grep
1
当所需连接数超过maxActive值时会发生什么? - BiGGZ
@BiGGZ 连接池将等待 maxWait 毫秒。如果在此期间没有连接返回到池中,它将抛出一个异常。 - Mike Mike
3
maxActive和maxIdle的概念是允许池的大小适应负载。当负载高时,maxActive确定池的大小,而当负载低时,maxIdle限制池的大小 - 以获得性能优势。请参见 https://dev59.com/Amox5IYBdhLWcg3wFAY1#54085623 获取详细解释。 - narayan
@BiGGZ,正如@(Mike Yakovets)所提到的,maxWait参数控制池等待连接可用的时间。在此之后,将抛出PoolExhaustedException异常。PoolExhaustedException - narayan
显示剩余2条评论

17

最大活跃连接数

the maximum number of active connections that can be allocated from this pool at the same time.  

该属性用于限制连接池可以打开的连接数。

maxIdle

(int) The maximum number of connections that should be kept in the pool **at all times.** 

这是为了限制空闲连接。 连接(不大于maxIdle的值)将不会被释放,以便下一次连接请求速度更快。

因此,总之,maxActive是用来限制最大连接数的。

但空闲连接(maxIdle或minIdle)更多地涉及性能问题(用时间和空间/资源进行交换),其中,maxIdle是用来限制你要与之交换时间的最大连接数(资源)。


谢谢您的回答,我现在对如何调整池有了一些了解。 - Anatoly Yakimchuk
如果我将maxActive设置为-1(无限制)并将maxIdle设置为100,是否会有任何负面影响? - user10098815
当有足够的资源请求时,您可能会遭受资源耗尽的困扰。 - JaskeyLam

17

假设您已将属性定义为:

maxActive = 100

本质上意味着

Size of the pool = maxActive = 100

仅使用maxActive存在的问题

Size of pool under heavy load = maxActive
Size of pool under no/low load = maxActive
即使没有负载(实际上没有连接被使用),所有100个连接都正在消耗资源。
您确实可以将maxActive减少到80。但这也意味着在重载时(应用程序正在使用所有可用连接),可用连接的上限也会降至80。
因此,您必须将maxActive作为池的大小。 maxIdle如何解决上述问题
假设您已经定义了属性
maxActive = 100
maxIdle = 80

这基本上意味着

Size of pool under heavy load = maxActive = 100
Size of pool under low load = maxIdle = 80

maxIdle属性能够使连接池适应负载情况。在高负载(正在使用的连接数 > maxIdle)期间,maxActive 属性是唯一决定连接池大小的属性。

但是,在没有负载的情况下(正在使用的连接数 < maxIdle),maxIdle 属性就成了决定连接池大小的唯一属性。

因此,正确设置maxIdle属性可以确保连接池不会影响性能。


如果我将maxActive设置为-1(无限制)并将maxIdle设置为100,是否会有任何负面影响? - user10098815
@user10098815,这意味着如果连接池中的连接数少于100,则您将最多拥有100个空闲连接。 - narayan

5
在小型环境中,连接数据库不是问题,因为连接数不多,服务器资源几乎保持不变。在大型环境中,连接到数据库的数量会消耗大量资源,因此,您需要优化管理数据库连接的方式,使用尽可能少的连接将为您提供更好的性能。在这一点上,maxActive设置可以由该池向数据库进行的最大连接数,从而限制了分配给请求者的资源。通过maxIdle,您指定如果连接“空闲”,则它将被关闭,除非有min“maxIdle”连接。为什么不少于maxIdle?因为您需要一些连接准备好下一个请求到达数据库,这样,如果必须填充池,则无需再次打开和关闭如此多的连接,因此可以释放大量资源。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接