理解Tomcat连接池设置

6

我希望了解我的Tomcat连接池生命周期理解是否正确。

例如,我有以下设置:

<Resource name="jdbc/appname" auth="Container"
type="javax.sql.DataSource" maxActive="100" 
maxIdle="30" maxWait="1000"
username="username" 
initialSize = "5"
password="password"
driverClassName="jdbc.driver.name"
url="jdbc:protocol://hostname:port/dbname"/>

当我的应用程序部署时,它有5个连接(初始大小),当所有这些连接都忙碌时,Tomcat会创建并添加到池中一个新的连接(6)。这个新连接的限制是maxActive(100),当101个请求到来时,Tomcat会等待1000毫秒(maxWait),然后抛出TimeOutException。在某段时间内,只有40个连接正在使用,当其中一个空闲时,它将被销毁,因为池中几乎有30个(maxIdle)空闲连接。我是正确的吗?
如果是这样,那么将maxIdle和maxActive设置为不同的值的目的是什么?
1个回答

7
在某一段时间内,只有40个连接是繁忙的,当其中一个空闲时,它将被销毁,因为池中几乎有30个(maxIdle)空闲连接。 当40条连接处于繁忙状态且其中一条变为空闲时,它变成了“空闲”,导致以下状态:
39 busy connections
1 idle connection 
maxActive设置指定在任何给定时间,可能存在的连接的最大数量,无论处于任何状态。而maxIdle设置更具体,仅确定空闲连接的最大数量。
假设maxActive设置为100,在某一时刻所有这些连接都存在并且正在忙碌,然后如果几分钟后它们全部处于空闲状态,您不希望保留这100个空闲连接,因为它们除了消耗资源之外没有做任何事情。
这就是maxIdle设置发挥作用的地方。它告诉连接池不要持有超过X个空闲连接。如果设置为30,则会放弃100个空闲连接中的70个连接。

感谢回复,“如果设置为30,则100个空闲连接中的70个连接将被丢弃。” 这意味着70个连接将被丢弃,30个连接现在处于空闲状态,但当所有30个连接都忙碌时,Tomcat会创建新连接,并在响应后自动变为空闲状态吗? - Almas Abdrazak
@АлмасАбдразак 是的,所有连接在它们不再忙于工作时都会变为空闲状态,而maxIdle设置确定了可以存在且不做任何事情的连接的最大数量。 - Luciano van der Veekens

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