diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/r2dbc/ConnectionFactoryConfigurations.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/r2dbc/ConnectionFactoryConfigurations.java index e1c5165d4a..3f80c5f81a 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/r2dbc/ConnectionFactoryConfigurations.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/r2dbc/ConnectionFactoryConfigurations.java @@ -29,6 +29,7 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; 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.Condition; import org.springframework.context.annotation.ConditionContext; @@ -69,15 +70,16 @@ abstract class ConnectionFactoryConfigurations { ConnectionFactory connectionFactory = createConnectionFactory(properties, resourceLoader.getClassLoader(), customizers.orderedStream().collect(Collectors.toList())); R2dbcProperties.Pool pool = properties.getPool(); - ConnectionPoolConfiguration.Builder builder = ConnectionPoolConfiguration.builder(connectionFactory) - .initialSize(pool.getInitialSize()).maxSize(pool.getMaxSize()).maxIdleTime(pool.getMaxIdleTime()) - .maxLifeTime(pool.getMaxLifeTime()).maxAcquireTime(pool.getMaxAcquireTime()) - .maxCreateConnectionTime(pool.getMaxCreateConnectionTime()) - .validationDepth(pool.getValidationDepth()); - - if (StringUtils.hasText(pool.getValidationQuery())) { - builder.validationQuery(pool.getValidationQuery()); - } + PropertyMapper map = PropertyMapper.get().alwaysApplyingWhenNonNull(); + ConnectionPoolConfiguration.Builder builder = ConnectionPoolConfiguration.builder(connectionFactory); + map.from(pool.getMaxIdleTime()).to(builder::maxIdleTime); + map.from(pool.getMaxLifeTime()).to(builder::maxLifeTime); + map.from(pool.getMaxAcquireTime()).to(builder::maxAcquireTime); + map.from(pool.getMaxCreateConnectionTime()).to(builder::maxCreateConnectionTime); + map.from(pool.getInitialSize()).to(builder::initialSize); + 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()); } diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/r2dbc/R2dbcProperties.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/r2dbc/R2dbcProperties.java index 5f61fdd969..dfbcc9b7a7 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/r2dbc/R2dbcProperties.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/r2dbc/R2dbcProperties.java @@ -142,19 +142,21 @@ public class R2dbcProperties { 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. diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/resources/META-INF/additional-spring-configuration-metadata.json b/spring-boot-project/spring-boot-autoconfigure/src/main/resources/META-INF/additional-spring-configuration-metadata.json index 48872b475b..194db53153 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/resources/META-INF/additional-spring-configuration-metadata.json +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/resources/META-INF/additional-spring-configuration-metadata.json @@ -1469,7 +1469,7 @@ "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" }, { diff --git a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/r2dbc/R2dbcAutoConfigurationTests.java b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/r2dbc/R2dbcAutoConfigurationTests.java index bb82c30a85..f8734fde94 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/r2dbc/R2dbcAutoConfigurationTests.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/r2dbc/R2dbcAutoConfigurationTests.java @@ -29,7 +29,6 @@ import io.r2dbc.pool.ConnectionPool; import io.r2dbc.pool.PoolMetrics; import io.r2dbc.spi.ConnectionFactory; import io.r2dbc.spi.Option; -import io.r2dbc.spi.ValidationDepth; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.BeanCreationException; @@ -63,27 +62,25 @@ class R2dbcAutoConfigurationTests { @Test void configureWithUrlAndPoolPropertiesApplyProperties() { - this.contextRunner - .withPropertyValues("spring.r2dbc.url:r2dbc:h2:mem:///" + randomDatabaseName(), - "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) -> { + this.contextRunner.withPropertyValues("spring.r2dbc.url:r2dbc:h2:mem:///" + randomDatabaseName(), + "spring.r2dbc.pool.max-size=15", "spring.r2dbc.pool.max-acquire-time=3m").run((context) -> { assertThat(context).hasSingleBean(ConnectionFactory.class).hasSingleBean(ConnectionPool.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(connectionPool).hasFieldOrPropertyWithValue("maxAcquireTime", Duration.ofMinutes(3)); + }); + } - R2dbcProperties properties = context.getBean(R2dbcProperties.class); - assertThat(properties.getPool().getInitialSize()).isEqualTo(5); - assertThat(properties.getPool().getMaxSize()).isEqualTo(15); - assertThat(properties.getPool().getMaxIdleTime()).isEqualTo(Duration.ofMillis(1)); - assertThat(properties.getPool().getMaxLifeTime()).isEqualTo(Duration.ofSeconds(2)); - assertThat(properties.getPool().getMaxAcquireTime()).isEqualTo(Duration.ofMinutes(3)); - assertThat(properties.getPool().getMaxCreateConnectionTime()).isEqualTo(Duration.ofHours(4)); - assertThat(properties.getPool().getValidationQuery()).isEqualTo("SELECT 1"); - assertThat(properties.getPool().getValidationDepth()).isEqualTo(ValidationDepth.REMOTE); + @Test + void configureWithUrlAndDefaultDoNotOverrideDefaultTimeouts() { + this.contextRunner.withPropertyValues("spring.r2dbc.url:r2dbc:h2:mem:///" + randomDatabaseName()) + .run((context) -> { + assertThat(context).hasSingleBean(ConnectionFactory.class).hasSingleBean(ConnectionPool.class) + .hasSingleBean(R2dbcProperties.class); + ConnectionPool connectionPool = context.getBean(ConnectionPool.class); + assertThat(connectionPool).hasFieldOrPropertyWithValue("maxAcquireTime", Duration.ZERO); }); }