Polish "Add additional properties to configure R2DBC pool"

See gh-21219
pull/22329/head
Stephane Nicoll 4 years ago
parent 0d41596a42
commit c8b67becce

@ -29,6 +29,7 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.autoconfigure.condition.SpringBootCondition; import org.springframework.boot.autoconfigure.condition.SpringBootCondition;
import org.springframework.boot.context.properties.PropertyMapper;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Condition; import org.springframework.context.annotation.Condition;
import org.springframework.context.annotation.ConditionContext; import org.springframework.context.annotation.ConditionContext;
@ -69,15 +70,16 @@ abstract class ConnectionFactoryConfigurations {
ConnectionFactory connectionFactory = createConnectionFactory(properties, resourceLoader.getClassLoader(), ConnectionFactory connectionFactory = createConnectionFactory(properties, resourceLoader.getClassLoader(),
customizers.orderedStream().collect(Collectors.toList())); customizers.orderedStream().collect(Collectors.toList()));
R2dbcProperties.Pool pool = properties.getPool(); R2dbcProperties.Pool pool = properties.getPool();
ConnectionPoolConfiguration.Builder builder = ConnectionPoolConfiguration.builder(connectionFactory) PropertyMapper map = PropertyMapper.get().alwaysApplyingWhenNonNull();
.initialSize(pool.getInitialSize()).maxSize(pool.getMaxSize()).maxIdleTime(pool.getMaxIdleTime()) ConnectionPoolConfiguration.Builder builder = ConnectionPoolConfiguration.builder(connectionFactory);
.maxLifeTime(pool.getMaxLifeTime()).maxAcquireTime(pool.getMaxAcquireTime()) map.from(pool.getMaxIdleTime()).to(builder::maxIdleTime);
.maxCreateConnectionTime(pool.getMaxCreateConnectionTime()) map.from(pool.getMaxLifeTime()).to(builder::maxLifeTime);
.validationDepth(pool.getValidationDepth()); map.from(pool.getMaxAcquireTime()).to(builder::maxAcquireTime);
map.from(pool.getMaxCreateConnectionTime()).to(builder::maxCreateConnectionTime);
if (StringUtils.hasText(pool.getValidationQuery())) { map.from(pool.getInitialSize()).to(builder::initialSize);
builder.validationQuery(pool.getValidationQuery()); map.from(pool.getMaxSize()).to(builder::maxSize);
} map.from(pool.getValidationQuery()).whenHasText().to(builder::validationQuery);
map.from(pool.getValidationDepth()).to(builder::validationDepth);
return new ConnectionPool(builder.build()); return new ConnectionPool(builder.build());
} }

@ -142,19 +142,21 @@ public class R2dbcProperties {
private Duration maxIdleTime = Duration.ofMinutes(30); private Duration maxIdleTime = Duration.ofMinutes(30);
/** /**
* Max lifetime. * Maximum lifetime of a connection in the pool. By default, connections have an
* infinite lifetime.
*/ */
private Duration maxLifeTime = Duration.ofMinutes(0L); private Duration maxLifeTime;
/** /**
* Max acquire time. * Maximum time to acquire a connection from the pool. By default, wait
* indefinitely.
*/ */
private Duration maxAcquireTime = Duration.ofMinutes(0L); private Duration maxAcquireTime;
/** /**
* Max create connection time. * Maximum time to wait to create a new connection. By default, wait indefinitely.
*/ */
private Duration maxCreateConnectionTime = Duration.ofMinutes(0L); private Duration maxCreateConnectionTime;
/** /**
* Initial connection pool size. * Initial connection pool size.

@ -1469,7 +1469,7 @@
"description": "Whether pooling is enabled. Enabled automatically if \"r2dbc-pool\" is on the classpath." "description": "Whether pooling is enabled. Enabled automatically if \"r2dbc-pool\" is on the classpath."
}, },
{ {
"name": "spring.r2dbc.pool.validationDepth", "name": "spring.r2dbc.pool.validation-depth",
"defaultValue": "local" "defaultValue": "local"
}, },
{ {

@ -29,7 +29,6 @@ import io.r2dbc.pool.ConnectionPool;
import io.r2dbc.pool.PoolMetrics; import io.r2dbc.pool.PoolMetrics;
import io.r2dbc.spi.ConnectionFactory; import io.r2dbc.spi.ConnectionFactory;
import io.r2dbc.spi.Option; import io.r2dbc.spi.Option;
import io.r2dbc.spi.ValidationDepth;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.BeanCreationException; import org.springframework.beans.factory.BeanCreationException;
@ -63,27 +62,25 @@ class R2dbcAutoConfigurationTests {
@Test @Test
void configureWithUrlAndPoolPropertiesApplyProperties() { void configureWithUrlAndPoolPropertiesApplyProperties() {
this.contextRunner this.contextRunner.withPropertyValues("spring.r2dbc.url:r2dbc:h2:mem:///" + randomDatabaseName(),
.withPropertyValues("spring.r2dbc.url:r2dbc:h2:mem:///" + randomDatabaseName(), "spring.r2dbc.pool.max-size=15", "spring.r2dbc.pool.max-acquire-time=3m").run((context) -> {
"spring.r2dbc.pool.initial-size=5", "spring.r2dbc.pool.max-size=15",
"spring.r2dbc.pool.max-idle-time=1ms", "spring.r2dbc.pool.max-life-time=2s",
"spring.r2dbc.pool.max-acquire-time=3m", "spring.r2dbc.pool.max-create-connection-time=4h",
"spring.r2dbc.pool.validation-query=SELECT 1", "spring.r2dbc.pool.validation-depth=remote")
.run((context) -> {
assertThat(context).hasSingleBean(ConnectionFactory.class).hasSingleBean(ConnectionPool.class) assertThat(context).hasSingleBean(ConnectionFactory.class).hasSingleBean(ConnectionPool.class)
.hasSingleBean(R2dbcProperties.class); .hasSingleBean(R2dbcProperties.class);
PoolMetrics poolMetrics = context.getBean(ConnectionPool.class).getMetrics().get(); ConnectionPool connectionPool = context.getBean(ConnectionPool.class);
PoolMetrics poolMetrics = connectionPool.getMetrics().get();
assertThat(poolMetrics.getMaxAllocatedSize()).isEqualTo(15); assertThat(poolMetrics.getMaxAllocatedSize()).isEqualTo(15);
assertThat(connectionPool).hasFieldOrPropertyWithValue("maxAcquireTime", Duration.ofMinutes(3));
});
}
R2dbcProperties properties = context.getBean(R2dbcProperties.class); @Test
assertThat(properties.getPool().getInitialSize()).isEqualTo(5); void configureWithUrlAndDefaultDoNotOverrideDefaultTimeouts() {
assertThat(properties.getPool().getMaxSize()).isEqualTo(15); this.contextRunner.withPropertyValues("spring.r2dbc.url:r2dbc:h2:mem:///" + randomDatabaseName())
assertThat(properties.getPool().getMaxIdleTime()).isEqualTo(Duration.ofMillis(1)); .run((context) -> {
assertThat(properties.getPool().getMaxLifeTime()).isEqualTo(Duration.ofSeconds(2)); assertThat(context).hasSingleBean(ConnectionFactory.class).hasSingleBean(ConnectionPool.class)
assertThat(properties.getPool().getMaxAcquireTime()).isEqualTo(Duration.ofMinutes(3)); .hasSingleBean(R2dbcProperties.class);
assertThat(properties.getPool().getMaxCreateConnectionTime()).isEqualTo(Duration.ofHours(4)); ConnectionPool connectionPool = context.getBean(ConnectionPool.class);
assertThat(properties.getPool().getValidationQuery()).isEqualTo("SELECT 1"); assertThat(connectionPool).hasFieldOrPropertyWithValue("maxAcquireTime", Duration.ZERO);
assertThat(properties.getPool().getValidationDepth()).isEqualTo(ValidationDepth.REMOTE);
}); });
} }

Loading…
Cancel
Save