在配置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);
是的,默认情况下,驱逐器线程不会运行。原因是默认情况下,maxIdle和maxTotal的值相同,这意味着没有要立即关闭的连接,也不需要退出空闲连接。因此,池只是通过不运行无用的线程来节省一些资源。
但是当您更改maxIdle
并使其低于maxTotal
而不启动evictor线程时,这并不意味着您的连接不会关闭。这意味着它们将在释放后立即关闭,没有延迟,直到它们的计数没有下降到maxIdle
。
然后minEvictableIdleTimeMillis
和softMinEvictableIdleTimeMillis
来玩(小心,留档中有错字,是... MinEvictalbe...
,不是... MiniEvictable...
)。它们之间的区别是前者不尊重minIdle
,而后者尊重。考虑到softMinEvictableIdleTimeMillis
仅在minEvictableIdleTimeMillis
经过时才检查,这有点棘手。
让我们假设我们有minevictableidletimillis=10000和
softminevictableidletimillis=-1(默认情况下)。在这种情况下,池中的空闲连接将保持不超过10秒。即使连接数不超过minIdle,它也将关闭。如果导致连接计数低于minIdle的断开,将立即创建新连接。
现在,让我们假设minevictableidletimellis=10000,softminevictableidletimellis=30000。在这种情况下,在检查minevictableidletimillis后的空闲连接,并检测到超出,将根据softminevictableidletimillis进行额外检查。如果空闲时间超过该时间,连接将关闭。否则,它将在池中等待下一次针对Minevictableidletimellis的阳性检查。
最终,您将立即关闭
maxTotal
和maxIdle
之间的连接,maxIdle
和minIdle
之间的连接在minEvictableIdleTimeMillis
之后关闭,minIdle
和0
之间的连接在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来处理与数据库的连接。我正在尝试防止连接池破坏空闲的连接。 我的配置是这样的 然而,我仍然不断得到 在一段时间不活动后。 据我所知,当足够的时间过去时,应该将连接从池中丢弃。因此,如果连接有一段时间没有使用(这就是我的情况),池中将没有连接,我尝试的第一次调用将失败,并出现给定错误。随后的调用顺利进行(直到新的超时) 我的问题是——如何防止这种情况? 编辑 在我的应用空闲一