Apache Commons Pool 2 中的 maxTotal 和 maxIdle 有什么区别?

What is the difference between maxTotal and maxIdle in Apache Commons Pool 2?

我正在使用 Apache Commons Pool 2 实现来为我的应用程序提供对象池机制。

截至目前,我已在我的代码中将 maxTotal()maxIdle() 的默认值设置为 10

但是我无法理解它们之间的区别是什么?如果我将 maxIdle() 设置为非常小(假设为 0)或非常大(等于 maxTotal())的值怎么办?

注意:Apache 类 内部建议对上述两个配置使用默认值 8。

连接池是一种与无限数量的并发用户共享有限数量的数据库连接的技术。最大总连接数(maxTotal)包括活动连接数和空闲连接数,即正在使用的连接数和当前未使用的连接数(它是所有连接数的总和)。最大空闲连接数 (maxIdle) 是准备好使用(但当前未使用)的连接数。如果将 maxTotal 设置为 100,则一次最多将打开 100 个连接到您的数据库,如果将 maxIdle 设置为 10,则如果正在使用 none 个连接最多可能会释放 90 个连接。池将根据需要重新连接

在池中,空闲连接已准备就绪,如果连接当前处于空闲状态,则连接请求不会阻塞(池 returns 空闲连接)。如果没有空闲连接,则池将阻塞以打开连接或直到连接返回池。

在你的问题中,两者的最大值为 10,将打开 10 个连接,并且池不会缩小或增大。

我仍然想知道 maxideminidle 之间的区别,因此提到 this, this 并想在这里为像我这样的人更新。

initialSize池启动时创建的初始连接数

maxActive 任何时候可以从此池中分配的最大活动连接数。该属性用于限制一个池中可以打开的连接数;这样就可以在数据库端进行容量规划

maxIdle = 池中应始终保留的最大空闲连接数。定期检查空闲连接(如果启用),空闲时间超过 minEvictableIdleTimeMillis 的连接将被释放

如果 maxIdle 在负载很重的系统上设置得太低,您可能会看到连接被关闭并且几乎立即打开新连接。所以最好让maxIdle接近maxActive。

minIdle 池中应始终保持的最小已建立连接数。如果验证查询失败,连接池可以缩小到这个数字以下。

timeBetweenEvictionRunsMillis 空闲对象驱逐器线程 运行 之间休眠的毫秒数。当非正数时,没有空闲对象驱逐器线程将是 运行.

minEvictableIdleTimeMillis 对象在有资格被逐出之前可以在池中闲置的最短时间。

此外,如果您想确保生产系统中没有失效的连接。 您可以使用下面的,但它是昂贵的操作,不利于性能关键但适合金融相关的应用程序服务。

database.connectionPool.testOnBorrow=true
database.connectionPool.testOnReturn=true
database.connectionPool.testWhileIdle=true