Map MinIdle and MaxValidationTime to R2DBC pools

Closes gh-34724
pull/35401/head
Moritz Halbritter 2 years ago
parent 52789cb191
commit 947ac8df73

@ -103,6 +103,8 @@ abstract class ConnectionFactoryConfigurations {
map.from(pool.getMaxSize()).to(builder::maxSize);
map.from(pool.getValidationQuery()).whenHasText().to(builder::validationQuery);
map.from(pool.getValidationDepth()).to(builder::validationDepth);
map.from(pool.getMinIdle()).to(builder::minIdle);
map.from(pool.getMaxValidationTime()).to(builder::maxValidationTime);
return new ConnectionPool(builder.build());
}

@ -1,5 +1,5 @@
/*
* Copyright 2012-2021 the original author or authors.
* Copyright 2012-2023 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@ -136,6 +136,13 @@ public class R2dbcProperties {
public static class Pool {
/**
* Minimal number of idle connections.
*
* @since 2.7.12
*/
private int minIdle = 0;
/**
* Maximum amount of time that a connection is allowed to sit idle in the pool.
*/
@ -153,6 +160,14 @@ public class R2dbcProperties {
*/
private Duration maxAcquireTime;
/**
* Maximum time to validate a connection from the pool. By default, wait
* indefinitely.
*
* @since 2.7.12
*/
private Duration maxValidationTime;
/**
* Maximum time to wait to create a new connection. By default, wait indefinitely.
*/
@ -183,6 +198,14 @@ public class R2dbcProperties {
*/
private boolean enabled = true;
public int getMinIdle() {
return this.minIdle;
}
public void setMinIdle(int minIdle) {
this.minIdle = minIdle;
}
public Duration getMaxIdleTime() {
return this.maxIdleTime;
}
@ -199,6 +222,14 @@ public class R2dbcProperties {
this.maxLifeTime = maxLifeTime;
}
public Duration getMaxValidationTime() {
return this.maxValidationTime;
}
public void setMaxValidationTime(Duration maxValidationTime) {
this.maxValidationTime = maxValidationTime;
}
public Duration getMaxAcquireTime() {
return this.maxAcquireTime;
}

@ -77,15 +77,25 @@ class R2dbcAutoConfigurationTests {
void configureWithUrlAndPoolPropertiesApplyProperties() {
this.contextRunner
.withPropertyValues("spring.r2dbc.url:r2dbc:h2:mem:///" + randomDatabaseName(),
"spring.r2dbc.pool.max-size=15", "spring.r2dbc.pool.max-acquire-time=3m")
"spring.r2dbc.pool.max-size=15", "spring.r2dbc.pool.max-acquire-time=3m",
"spring.r2dbc.pool.min-idle=1", "spring.r2dbc.pool.max-validation-time=1s",
"spring.r2dbc.pool.initial-size=0")
.run((context) -> {
assertThat(context).hasSingleBean(ConnectionFactory.class)
.hasSingleBean(ConnectionPool.class)
.hasSingleBean(R2dbcProperties.class);
ConnectionPool connectionPool = context.getBean(ConnectionPool.class);
PoolMetrics poolMetrics = connectionPool.getMetrics().get();
assertThat(poolMetrics.getMaxAllocatedSize()).isEqualTo(15);
assertThat(connectionPool).hasFieldOrPropertyWithValue("maxAcquireTime", Duration.ofMinutes(3));
connectionPool.warmup().block();
try {
PoolMetrics poolMetrics = connectionPool.getMetrics().get();
assertThat(poolMetrics.idleSize()).isEqualTo(1);
assertThat(poolMetrics.getMaxAllocatedSize()).isEqualTo(15);
assertThat(connectionPool).hasFieldOrPropertyWithValue("maxAcquireTime", Duration.ofMinutes(3));
assertThat(connectionPool).hasFieldOrPropertyWithValue("maxValidationTime", Duration.ofSeconds(1));
}
finally {
connectionPool.close().block();
}
});
}

Loading…
Cancel
Save