我想知道我对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 ms(maxWait),然后抛出TimeOutException。在一段时间内,只有40个连接处于繁忙状态,而其中一个空闲时,它将被销毁,因为池中几乎有30个(最大空闲)连接。我对吗?

如果我愿意,那么将maxIdle和maxActive设置为不同值的目的是什么?

最佳答案

在一段时间内,只有40个连接处于繁忙状态,而其中一个空闲时,它将被销毁,因为池中几乎有30个(最大空闲)连接。

当40个连接繁忙并且其中一个空闲时,它变为空闲,从而导致以下状态:

39 busy connections
1 idle connection
maxActive设置指定在任何给定时间在任何状态下可能存在的最大连接数。 maxIdle设置更为具体,仅确定空闲连接的最大数量。

假设maxActive设置为100,并且所有这些连接在某个时刻都存在并且处于繁忙状态,那么如果几分钟后它们都处于空闲状态,则您不想保留这100个空闲连接,因为它们没有执行任何操作除了消耗资源。

这是maxIdle设置起作用的地方。它告诉连接池容纳的空闲连接不超过X个。如果将其设置为30,则会丢弃100个空闲连接中的70个连接。

07-24 19:39
查看更多