【问题标题】:DBCP2 BasicDataSource Idle connections not getting clearedDBCP2 BasicDataSource 空闲连接未清除
【发布时间】:2017-07-29 15:39:21
【问题描述】:

我看到空闲连接没有被清除。不知道是什么原因?

initialSize-10 maxtotal-20 最大 10 迷你-0 minEvictableIdleTimeMillis-30min numTestsPerEvictionRun-60 分钟 numTestsPerEvictionRun-20 testOnBorrow-true testWhileIdle-true validationQuery-select 1 from dual

从各种来源提供的以下是我的理解 与 Datasource 的 maxtotal- maxactive 连接数在上述情况下为 20

maxidle- 可以保留在池中的空闲连接数。这些被清扫机清除。在上述情况下,如果连接保持空闲 30 分钟,则该连接处于空闲状态。如果清扫器每 60 分钟运行一次,它会检查 20 个空闲连接并清除空闲连接。超过此值的空闲连接将立即关闭。

以上理解正确吗?

我正在使用 BasicDataSourceMXBean 打印统计数据

{"NumActive":"0","NumIdle":"10","isClosed":"false","maxTotal":"20","MaxIdle":"10","MinIdle":"0 "}

即使没有流量,空闲连接也不会被清除。上面的配置有什么问题吗?

还有什么是 minIdle,我们什么时候应该将它设置为非零值?

最近将休眠版本从 3.6.0.Final 升级到休眠 4.3.11.Final 并从旧的 spring 版本升级到 4.2.9。

之前空闲的连接被清除了。但是自从升级以来,空闲连接并没有被清除。

【问题讨论】:

  • 您确定设置不应该是testWhileIdle 而不是testOnIdle 以便驱逐空闲连接吗?

标签: spring hibernate jdbc database-connection apache-commons-dbcp


【解决方案1】:

我看到空闲连接没有被清除。我不知道 是什么原因?

https://commons.apache.org/proper/commons-dbcp/configuration.html

其他人指出的 testWhileIdle 与 testOnIdle 问题应该可以解决您关于空闲连接为何保持打开状态的问题。您假设您的 initialSize=10 连接将在 60 分钟标记处被驱逐清扫器清除以使您降至 minIdle=0 是正确的。为什么你想要一个 minIdle=0 是一个不同的问题?连接池的全部目的实际上是预先验证、测试和建立您的连接,以便它们可以位于您的池“空闲”中,并且可以通过传入请求“借用”。这通过将执行时间减少到仅 SQL 会话来提高性能。

还有什么是 minIdle,我们什么时候应该将它设置为非零值?

这些空闲连接将预先建立并保持等待您未来的 SQL 请求。 minIdle 的大小取决于您的应用程序,但 DBCP2 的默认值为 8,这可能是一个不错的起点。这个想法是保持足够的手头来跟上池的平均需求。当您有流量突发时,您将设置一个 maxIdle 来处理那些高峰时间。您应用的 testWhileIdle=true 配置将在扫地机出现时运行 validationQuery,但默认情况下每次运行仅测试 3 个连接。如果要测试更多,可以将 numTestsPerEvictionRun 配置为更高的数字。这些“测试”确保您的连接仍处于良好状态,因此您不会在执行期间从池中获取“坏”空闲连接。

我怀疑您可能更关心“挂起”连接而不是“空闲”连接。如果是这种情况,您将需要查看旨在破坏运行时间超过 X 时间的“活动”连接的“废弃”配置。 removeAbandonedOnMaintenance=true 以及 removeAbandonedTimeout={numberOfSecondsBeforeEligibleForRemoval}。

【讨论】:

    【解决方案2】:

    我看过的所有地方,似乎属性应该是testWhileIdle 而不是testOnIdle。该设置默认为false,因此您的空闲线程不会被测试有效性,因此不会被驱逐。

    minIdle 基本上告诉连接池允许多少空闲线程。我从文档中了解到,当minIdle0 时,应该没有空闲连接。

    通常minIdle 默认为与initialSize 相同的值。

    【讨论】:

    • 它的 testWhileIdle。我仍然不明白为什么 90 分钟后还有空闲连接。是否存在永远不会清除空闲连接的情况?
    猜你喜欢
    • 2016-12-05
    • 2017-09-22
    • 2019-01-25
    • 2017-12-04
    • 2022-07-05
    • 2021-03-02
    • 2020-04-29
    • 2014-12-04
    • 2017-04-14
    相关资源
    最近更新 更多