当前位置: 首页 > 知识库问答 >
问题:

DBCP2-何时从池中删除空闲连接

杜俊爽
2023-03-14

在配置DBCP2池时,根据文档,我注意到-有一个名为timebetweenvictionrunsmillis的配置,描述如下:

空闲对象逐出器线程运行之间的Hibernate毫秒数。如果为非正,则不会运行空闲对象逐出器线程。

其默认值为-1。

这是否意味着逐出器线程永远不会在默认配置下运行?那么配置参数maxIdle是如何强制的?如果空闲连接的计数大于maxIdle,池必须退出空闲连接。

默认配置是这样的,空闲连接永远不会被逐出,这让我感到非常困惑。

还有另一种配置SoftminiReceivableIdleTimeMillis,它似乎在内景运行时间间隔(timebetweenvictionrunsmillis)上起到了一定的作用。

这方面的任何澄清都将大有裨益。

目前,我正在如下所示配置池-因为我的目标是在池中不要有太长时间的空闲连接(这是必要的,因为我们使用的是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);

共有1个答案

蒲寂离
2023-03-14

是的,默认情况下,驱逐器线程不会运行。原因是默认情况下,maxIdle和maxTotal的值相同,这意味着没有要立即关闭的连接,也不需要退出空闲连接。因此,池只是通过不运行无用的线程来节省一些资源。

但是当您更改maxIdle并使其低于maxTotal而不启动evictor线程时,这并不意味着您的连接不会关闭。这意味着它们将在释放后立即关闭,没有延迟,直到它们的计数没有下降到maxIdle

然后minEvictableIdleTimeMillissoftMinEvictableIdleTimeMillis来玩(小心,留档中有错字,是... MinEvictalbe...,不是... MiniEvictable...)。它们之间的区别是前者不尊重minIdle,而后者尊重。考虑到softMinEvictableIdleTimeMillis仅在minEvictableIdleTimeMillis经过时才检查,这有点棘手。

让我们假设我们有minevictableidletimillis=10000和softminevictableidletimillis=-1(默认情况下)。在这种情况下,池中的空闲连接将保持不超过10秒。即使连接数不超过minIdle,它也将关闭。如果导致连接计数低于minIdle的断开,将立即创建新连接。

现在,让我们假设minevictableidletimellis=10000,softminevictableidletimellis=30000。在这种情况下,在检查minevictableidletimillis后的空闲连接,并检测到超出,将根据softminevictableidletimillis进行额外检查。如果空闲时间超过该时间,连接将关闭。否则,它将在池中等待下一次针对Minevictableidletimellis的阳性检查。

最终,您将立即关闭maxTotalmaxIdle之间的连接,maxIdleminIdle之间的连接在minEvictableIdleTimeMillis之后关闭,minIdle0之间的连接在softMinEvictableIdleTimeMillis之后关闭并立即重新打开。给予或接受驱逐检查期限。

通过配置,当池大于20时,将立即关闭所有连接。这20个连接的生存时间为10到20分钟(即使空闲),因为您有10分钟的可收回空闲时间和10分钟的时间间隔。

我还想提到一个潜在的问题,即maxIdle和maxTotal之间的差距很大。如果您希望经常超过maxIdle,最好增加它。否则,您将面临持续的连接打开和关闭,这将对您的数据库(因为建立新的db连接是一项相对繁重的操作)和app server网络基础设施造成额外的压力(因为关闭的连接将挂起在TIME\u WAIT状态,耗尽您的网络端口池)。

 类似资料:
  • initialSize-10 maxtotal-20 maxidle-10 minidle-0 minEvictableIdleTimeMillis-30min numTestsPerEvictionRun-60min numTestsPerEvictionRun-20 testonborrow-true testwhileidle-true validationquery-从dual中选择1 从

  • 我正在使用固定大小的Java线程池(ExecutorService)。假设我向线程池提交了一个作业,并且该作业处于空闲状态。 是否有可能从线程池中删除空闲作业,以便可以处理队列中的其他作业,然后再添加空闲作业?

  • null 如果我理解正确的话,我们应该在启动时有1个空闲连接,根据负载从0到3,对吗? 正在发生的情况是:启动时1个连接,如果负载较低,最多3个空闲连接,高负载后超过3个空闲连接。然后这些连接不会立即关闭,我们不知道它们何时/是否会关闭(有时它们中的一些会关闭)。 所以问题是:这种行为正常吗? DAO子类的使用示例:

  • 我正在使用带有连接池的reactor-netty http客户端(0.7.X系列),我想配置池连接的空闲超时,但不知道在哪里。 更准确地说,我需要配置reactor-netty http客户端连接池,使其能够自动关闭在可配置超时内未看到任何活动的连接。这些连接是开放的,但在一段(可配置的)时间内没有传输字节。 如何配置reactory-netty超文本传输协议客户端抢先关闭空闲连接?

  • 我对HikariCP很陌生,我遇到了一个问题。我有一个使用hikaridaTasource从数据库获取连接的方法: 但是,当我检查pgAdmin(这是一个PostgreSQL db btw)时,我看到它没有使用空闲连接,而是创建了一堆新连接。我怎么才能修好这个? 您可以看到,在第一个图像中有19个连接,其中18个是空闲的。但是,在查询之后,会有一堆新的连接,其中大多数是空闲的。我配置Hikari错

  • 我正在使用Knex.js来处理与数据库的连接。我正在尝试防止连接池破坏空闲的连接。 我的配置是这样的 然而,我仍然不断得到 在一段时间不活动后。 据我所知,当足够的时间过去时,应该将连接从池中丢弃。因此,如果连接有一段时间没有使用(这就是我的情况),池中将没有连接,我尝试的第一次调用将失败,并出现给定错误。随后的调用顺利进行(直到新的超时) 我的问题是——如何防止这种情况? 编辑 在我的应用空闲一