我使用Apache Commons Pool 2实现为我的应用程序提供了对象池机制。
截至目前,我已在代码中将maxTotal()
和maxIdle()
的默认值设置为10
。
但我无法理解它们之间有什么区别?如果我将maxIdle()
设置为非常小的值(假设为0)或非常大(等于maxTotal()
),该怎么办?
注意:Apache类在内部建议上述两个配置的默认值为8。
答案 0 :(得分:18)
连接池是一种与无限数量的并发用户共享有限数量的数据库连接的技术。最大总连接数(maxTotal
)包括活动连接和空闲连接,即正在使用的连接和当前未使用的连接(它是所有连接的总和)。最大空闲连接(maxIdle
)是准备使用的连接(但当前未使用)。如果将maxTotal
设置为100,那么如果maxIdle
设置为10,则一次最多可以为数据库打开100个连接,如果没有连接最多使用90个连接可能会被释放。该池将按需重新连接。
在池中,空闲连接已准备就绪,如果连接当前处于空闲状态(池返回空闲连接),则不会阻止连接请求。如果没有连接空闲,则池将阻止打开连接或直到连接返回池。
在你的问题中,两者的最大值为10,将打开10个连接,池不会缩小或增长。
答案 1 :(得分:2)
我仍然很想知道maxide
和minidle
之间的区别,因此提到了this,this,并希望在此处更新像我这样的其他人。
initialSize 启动池时创建的初始连接数
maxActive 可以随时从此池分配的最大活动连接数。此属性用于限制池中可以打开的连接数;这样就可以在数据库端完成容量规划
maxIdle =应始终在池中保留的最大空闲连接数。定期检查空闲连接(如果已启用),并且将释放空闲时间超过minEvictableIdleTimeMillis的连接
如果在负载很重的系统上将maxIdle设置得太低,您可能会看到连接被关闭,几乎立即打开新连接。所以最好让maxIdle接近maxActive。
minIdle 应始终在池中保留的最小已建立连接数。如果验证查询失败,连接池可以缩小到此数字以下。
timeBetweenEvictionRunsMillis 在空闲对象逐出器线程的运行之间休眠的毫秒数。当为非正数时,将不会运行空闲对象逐出器线程。
minEvictableIdleTimeMillis 对象在符合驱逐资格之前可能在池中闲置的最短时间。
此外,如果您想确保生产系统中没有陈旧连接。 您可以使用下面的内容,但这对于性能至关重要的操作而言并不昂贵,但适用于与财务相关的应用程序服务。
database.connectionPool.testOnBorrow=true
database.connectionPool.testOnReturn=true
database.connectionPool.testWhileIdle=true