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

Tomcat连接池的maxActive和maxIdle之间有什么区别?,tomcat,database-connection,Tomcat,Database Connection,tomcat连接池有一个名为maxActive的设置和一个名为maxIdle的设置。我的问题是 这两种设置之间有什么区别 现实世界中的示例场景是什么,其中maxActive的值可能与maxIdle的值不同 由于某种原因,这些文件对我来说毫无意义。根据上的文档,ApacheDBCP和Tomact7JDBC池中都存在maxActive和maxIdle maxActive(int)可以连接的最大活动连接数 同时从该池中分配。默认值为100 maxIdle(int)应保持的最大连接数 任何时候都在游泳

tomcat连接池有一个名为maxActive的设置和一个名为maxIdle的设置。我的问题是

  • 这两种设置之间有什么区别
  • 现实世界中的示例场景是什么,其中maxActive的值可能与maxIdle的值不同 由于某种原因,这些文件对我来说毫无意义。根据上的文档,ApacheDBCP和Tomact7JDBC池中都存在maxActive和maxIdle

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

    maxIdle(int)应保持的最大连接数 任何时候都在游泳池里。默认值为maxActive:100 Idle 定期检查连接(如果启用),并且 闲置时间超过我的时间VictobleIDletimillis将被释放。 (另请参见testWhileIdle)


    maxActive是直截了当的。maxIdle可以这样解释-假设您有100个最大活动连接,并将maxIdle设置为80。假设没有到数据库的请求,那么将只测试80个连接(通过validationquery)并保持活动状态。其他20个将关闭。因此,在任何时候,您只能有80个空闲连接。
    您可能希望将其设置为不同的数字,以防止额外的(不必要的)数据库连接。因为数据库提供的每个连接都会消耗资源(如内存)。

    但是,假设您已将maxActive大小设置为100,并且几乎所有100个都在使用中,则此设置显然无关紧要。

    在小型环境中,与数据库的连接不是问题,因为没有太多连接,服务器资源几乎完好无损。在大型环境中,到数据库的连接数量会消耗大量资源,因此,您需要优化管理数据库连接的方式,使用尽可能少的连接数量将获得更好的性能。在这一点上,maxActive设置该池可以与数据库建立的最大连接数,从而限制分配给请求者的资源。使用maxIdle,您可以指定,如果连接“空闲”,它将被关闭,除非存在最小的“maxIdle”连接。为什么不小于maxIdle?因为您需要一些连接来准备下一个数据库请求,所以如果必须填充池,您不需要再次打开和关闭这么多连接,因此您可以释放大量资源。

    maxActive 此属性用于限制池可以打开的连接数

    maxIdle 这是为了限制空闲连接。连接(不大于maxIdle的值)将不会被释放,因此下一个连接请求将更快

    所以一句话,maxActive就是限制最大连接数


    但是idle(
    maxIdle
    minIdle
    )更多的是用于性能问题(与空间/资源交换时间),其中,maxIdle用于限制要与之交换时间的最大连接数(资源)。

    假设您已将该属性定义为

    maxActive = 100
    
    这基本上意味着

    Size of the pool = maxActive = 100
    
    仅使用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值可以确保连接池不会产生不必要的性能影响。

    1。当你写80个连接将被测试时,你的意思是什么?为什么又有20家关门了?我不明白maxActive有什么好处。当所需连接数超过maxActive值时会发生什么情况?@BiGGZ连接池将等待
    maxWait
    ms。如果在此期间没有连接返回到轮询,它将抛出异常。@grep让maxActive和maxIdle允许使池适应负载。当负载较高时,maxActive确定池的大小,而当负载较低时,maxIdle限制池的大小,以提高性能。有关详细信息,请参阅explanation@BiGGZ正如@(MikeYakovets)提到的,maxWait参数控制池等待连接可用的时间量。这篇文章,是Thrown感谢你们,并接受了回答,澄清了这一刻!现在我有了一些关于如何调整池的知识。如果我将maxActive设置为-1(无限制)并将maxIdle设置为100,是否会有任何负面影响?当有足够的资源请求时,您可能会遇到资源耗尽的问题。如果我将maxActive设置为-1(无限制),是否会有任何负面影响maxIdle为100?@user10098815这意味着,如果使用的连接数少于100,则池中的空闲连接数将不超过100个。
    Size of pool under heavy load = maxActive
    Size of pool under no/low load = maxActive
    
    maxActive = 100
    maxIdle = 80
    
    Size of pool under heavy load = maxActive = 100
    Size of pool under low load = maxIdle = 80