Wan*_*ker 9 java connection-pooling apache-commons-dbcp
在配置DBCP2池时,基于我注意到的文档 - 有一个被称为配置的配置timeBetweenEvictionRunsMillis描述如下:
在空闲对象逐出器线程的运行之间休眠的毫秒数.当非正数时,将不运行空闲对象逐出器线程.
它的默认值是-1.
这是否意味着evictor线程永远不会在默认配置中运行?然后如何maxIdle强制执行配置参数- 如果池的计数大于,则池必须驱逐空闲连接maxIdle.
对我来说,默认配置是永远不会驱逐空闲连接似乎非常混乱.
还有另一种配置softMiniEvictableIdleTimeMillis似乎在其上发挥了一些作用timeBetweenEvictionRunsMillis.
在这方面的任何澄清都将是非常有帮助的.
暂时,我正在配置下面的池 - 因为我的目标是在我的池中没有任何空闲连接太长时间(这是我们使用AWS RDS所需要的,并且我们似乎有一个奇怪的问题,我们经常遇到)
BasicDataSource dataSource = new BasicDataSource();
dataSource.setDriverClassName("com.mysql.jdbc.Driver");
dataSource.setUrl(properties.getProperty("app.mysql.url"));
dataSource.setUsername(properties.getProperty("app.mysql.username"));
dataSource.setPassword(properties.getProperty("app.mysql.password"));
dataSource.setMaxIdle(20);
dataSource.setMaxWaitMillis(20000); //wait 10 seconds to get new connection
dataSource.setMaxTotal(200);
dataSource.setMinIdle(0);
dataSource.setInitialSize(10);
dataSource.setTestOnBorrow(true);
dataSource.setValidationQuery("select 1");
dataSource.setValidationQueryTimeout(10); //The value is in seconds
dataSource.setTimeBetweenEvictionRunsMillis(600000); // 10 minutes wait to run evictor process
dataSource.setSoftMinEvictableIdleTimeMillis(600000); // 10 minutes wait to run evictor process
dataSource.setMinEvictableIdleTimeMillis(60000); // 60 seconds to wait before idle connection is evicted
dataSource.setMaxConnLifetimeMillis(600000); // 10 minutes is max life time
dataSource.setNumTestsPerEvictionRun(10);
Run Code Online (Sandbox Code Playgroud)
And*_*gin 15
是的,默认情况下,evictor线程不会运行.原因是默认值的值maxIdle和maxTotal是相同的,这意味着没有连接可以立即关闭,也不需要驱逐空闲连接.因此,池只是通过不运行无用的线程来节省一些资源.
但是当你更改maxIdle并使其低于maxTotal没有启动evictor线程时,它并不意味着你的连接不会被关闭.这意味着他们将在释放后立即关闭,不会有任何延迟,直到他们的计数不下降为止maxIdle.
然后minEvictableIdleTimeMillis与softMinEvictableIdleTimeMillis前来游玩(要小心,有文档中一个错字,它...MinEvictalbe...不是...MiniEvictable...).它们之间的区别在于前者不尊重minIdle后者.考虑到softMinEvictableIdleTimeMillis仅在minEvictableIdleTimeMillis经过时检查的事实,这有点棘手.
假设我们有minEvictableIdleTimeMillis=10000和softMinEvictableIdleTimeMillis=-1(默认).在这种情况下,空闲连接将在池中保留不超过10秒.即使连接数不超过minIdle,也将关闭.如果导致连接数减少minIdle,则会立即创建新连接.
现在,让我们假设我们拥有minEvictableIdleTimeMillis=10000和softMinEvictableIdleTimeMillis=30000.在这种情况下minEvictableIdleTimeMillis,将另外检查在检查和检测到超出之后的空闲连接softMinEvictableIdleTimeMillis.如果空闲时间超过它,则连接将关闭.否则,它将坐在游泳池中,直到下一次正面检查minEvictableIdleTimeMillis.
最终,你将不得不之间的连接maxTotal,并maxIdle立即关闭,之间的连接maxIdle和minIdle后关闭minEvictableIdleTimeMillis和之间的连接minIdle和0关闭后softMinEvictableIdleTimeMillis立即重新打开.给予或采取逐出检查期.
使用您的配置,当池大于20时,您将立即关闭所有连接.这20个连接将在10到20分钟内(即使空闲),因为您有10分钟的时间EvictableIdleTimeMillis加10分钟TimeBetweenEvictionRunsMillis.
我还想提一个潜在的问题,maxIdle和之间的差距很大maxTotal.如果您预计maxIdle会经常超出,那么最好增加它.否则,你将面临持续连接的打开和关闭,这将你的数据库上创建额外的压力(因为建立新的数据库连接是比较重的操作)和应用程序服务器的网络基础设施(因为关闭的连接将在TIME_WAIT状态挂消耗网络端口池).
| 归档时间: |
|
| 查看次数: |
10222 次 |
| 最近记录: |