From 0ec607ecb16a923b7db562217976c7ba230d90f9 Mon Sep 17 00:00:00 2001 From: Rodolpho Couto Date: Wed, 29 Apr 2020 00:19:27 -0300 Subject: [PATCH 1/6] Add missing R2DBC pool properties --- .../ConnectionFactoryConfigurations.java | 15 +++++- .../autoconfigure/r2dbc/R2dbcProperties.java | 53 +++++++++++++++++++ 2 files changed, 66 insertions(+), 2 deletions(-) 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 d918470ba615..481330eeadeb 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 @@ -43,6 +43,7 @@ * * @author Mark Paluch * @author Stephane Nicoll + * @author Rodolpho S. Couto */ abstract class ConnectionFactoryConfigurations { @@ -67,12 +68,22 @@ ConnectionPool connectionFactory(R2dbcProperties properties, ResourceLoader reso ObjectProvider customizers) { ConnectionFactory connectionFactory = createConnectionFactory(properties, resourceLoader.getClassLoader(), customizers.orderedStream().collect(Collectors.toList())); + R2dbcProperties.Pool pool = properties.getPool(); - ConnectionPoolConfiguration.Builder builder = ConnectionPoolConfiguration.builder(connectionFactory) - .maxSize(pool.getMaxSize()).initialSize(pool.getInitialSize()).maxIdleTime(pool.getMaxIdleTime()); + 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()); } + 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 7792e673921e..b4647603f0fd 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 @@ -21,6 +21,7 @@ import java.util.Map; import java.util.UUID; +import io.r2dbc.spi.ValidationDepth; import org.springframework.boot.context.properties.ConfigurationProperties; /** @@ -29,6 +30,7 @@ * @author Mark Paluch * @author Andreas Killaitis * @author Stephane Nicoll + * @author Rodolpho S. Couto * @since 2.3.0 */ @ConfigurationProperties(prefix = "spring.r2dbc") @@ -138,6 +140,21 @@ public static class Pool { */ private Duration maxIdleTime = Duration.ofMinutes(30); + /** + * Max lifetime. + */ + private Duration maxLifeTime = Duration.ZERO; + + /** + * Max acquire time. + */ + private Duration maxAcquireTime = Duration.ZERO; + + /** + * Max create connection time. + */ + private Duration maxCreateConnectionTime = Duration.ZERO; + /** * Initial connection pool size. */ @@ -153,6 +170,11 @@ public static class Pool { */ private String validationQuery; + /** + * Validation depth. + */ + private ValidationDepth validationDepth = ValidationDepth.LOCAL; + public Duration getMaxIdleTime() { return this.maxIdleTime; } @@ -161,6 +183,30 @@ public void setMaxIdleTime(Duration maxIdleTime) { this.maxIdleTime = maxIdleTime; } + public Duration getMaxLifeTime() { + return maxLifeTime; + } + + public void setMaxLifeTime(Duration maxLifeTime) { + this.maxLifeTime = maxLifeTime; + } + + public Duration getMaxAcquireTime() { + return maxAcquireTime; + } + + public void setMaxAcquireTime(Duration maxAcquireTime) { + this.maxAcquireTime = maxAcquireTime; + } + + public Duration getMaxCreateConnectionTime() { + return maxCreateConnectionTime; + } + + public void setMaxCreateConnectionTime(Duration maxCreateConnectionTime) { + this.maxCreateConnectionTime = maxCreateConnectionTime; + } + public int getInitialSize() { return this.initialSize; } @@ -185,6 +231,13 @@ public void setValidationQuery(String validationQuery) { this.validationQuery = validationQuery; } + public ValidationDepth getValidationDepth() { + return validationDepth; + } + + public void setValidationDepth(ValidationDepth validationDepth) { + this.validationDepth = validationDepth; + } } } From be021244eebc2ffdad748fd5128c88f83db1809b Mon Sep 17 00:00:00 2001 From: Rodolpho Couto Date: Wed, 29 Apr 2020 00:33:27 -0300 Subject: [PATCH 2/6] Fix formatting --- .../r2dbc/ConnectionFactoryConfigurations.java | 10 +++------- .../boot/autoconfigure/r2dbc/R2dbcProperties.java | 1 + 2 files changed, 4 insertions(+), 7 deletions(-) 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 481330eeadeb..fcf4a0a410e9 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 @@ -70,13 +70,9 @@ ConnectionPool connectionFactory(R2dbcProperties properties, ResourceLoader reso 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()) + 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()); 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 b4647603f0fd..fb6a8a9f9d12 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 @@ -238,6 +238,7 @@ public ValidationDepth getValidationDepth() { public void setValidationDepth(ValidationDepth validationDepth) { this.validationDepth = validationDepth; } + } } From 17f45a366d50eea253e3a3ce4e1d864317254ab9 Mon Sep 17 00:00:00 2001 From: Rodolpho Couto Date: Wed, 29 Apr 2020 00:49:39 -0300 Subject: [PATCH 3/6] Fix formatting --- .../boot/autoconfigure/r2dbc/R2dbcProperties.java | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) 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 fb6a8a9f9d12..3e5295b32efd 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 @@ -22,6 +22,7 @@ import java.util.UUID; import io.r2dbc.spi.ValidationDepth; + import org.springframework.boot.context.properties.ConfigurationProperties; /** @@ -184,7 +185,7 @@ public void setMaxIdleTime(Duration maxIdleTime) { } public Duration getMaxLifeTime() { - return maxLifeTime; + return this.maxLifeTime; } public void setMaxLifeTime(Duration maxLifeTime) { @@ -192,7 +193,7 @@ public void setMaxLifeTime(Duration maxLifeTime) { } public Duration getMaxAcquireTime() { - return maxAcquireTime; + return this.maxAcquireTime; } public void setMaxAcquireTime(Duration maxAcquireTime) { @@ -200,7 +201,7 @@ public void setMaxAcquireTime(Duration maxAcquireTime) { } public Duration getMaxCreateConnectionTime() { - return maxCreateConnectionTime; + return this.maxCreateConnectionTime; } public void setMaxCreateConnectionTime(Duration maxCreateConnectionTime) { @@ -232,7 +233,7 @@ public void setValidationQuery(String validationQuery) { } public ValidationDepth getValidationDepth() { - return validationDepth; + return this.validationDepth; } public void setValidationDepth(ValidationDepth validationDepth) { From d3d38d2d2219c182feb7cb51d63025e203ae9081 Mon Sep 17 00:00:00 2001 From: Rodolpho Couto Date: Sat, 13 Jun 2020 15:35:49 -0300 Subject: [PATCH 4/6] Code review changes --- .../r2dbc/ConnectionFactoryConfigurations.java | 2 -- .../boot/autoconfigure/r2dbc/R2dbcProperties.java | 6 +++--- .../META-INF/additional-spring-configuration-metadata.json | 4 ++++ 3 files changed, 7 insertions(+), 5 deletions(-) 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 fcf4a0a410e9..e1c5165d4acb 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 @@ -68,7 +68,6 @@ ConnectionPool connectionFactory(R2dbcProperties properties, ResourceLoader reso ObjectProvider customizers) { 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()) @@ -79,7 +78,6 @@ ConnectionPool connectionFactory(R2dbcProperties properties, ResourceLoader reso if (StringUtils.hasText(pool.getValidationQuery())) { builder.validationQuery(pool.getValidationQuery()); } - 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 3e5295b32efd..5f61fdd96951 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 @@ -144,17 +144,17 @@ public static class Pool { /** * Max lifetime. */ - private Duration maxLifeTime = Duration.ZERO; + private Duration maxLifeTime = Duration.ofMinutes(0L); /** * Max acquire time. */ - private Duration maxAcquireTime = Duration.ZERO; + private Duration maxAcquireTime = Duration.ofMinutes(0L); /** * Max create connection time. */ - private Duration maxCreateConnectionTime = Duration.ZERO; + private Duration maxCreateConnectionTime = Duration.ofMinutes(0L); /** * 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 4979e811881b..eee18698f351 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 @@ -1471,6 +1471,10 @@ "type": "java.lang.Boolean", "description": "Whether pooling is enabled. Enabled automatically if \"r2dbc-pool\" is on the classpath." }, + { + "name": "spring.r2dbc.pool.validationDepth", + "defaultValue": "local" + }, { "name": "spring.rabbitmq.cache.connection.mode", "defaultValue": "channel" From 098c9122e23c0eeddbd9058e54ab37b870d48753 Mon Sep 17 00:00:00 2001 From: Rodolpho Couto Date: Tue, 16 Jun 2020 11:34:20 -0300 Subject: [PATCH 5/6] Add tests --- .../r2dbc/R2dbcAutoConfigurationTests.java | 25 +++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) 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 5e8a3f5998ab..59557cea1604 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 @@ -18,6 +18,7 @@ import java.net.URL; import java.net.URLClassLoader; +import java.time.Duration; import java.util.UUID; import java.util.function.Function; @@ -28,6 +29,7 @@ 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; @@ -62,10 +64,29 @@ void configureWithUrlCreateConnectionPoolByDefault() { @Test void configureWithUrlAndPoolPropertiesApplyProperties() { this.contextRunner.withPropertyValues("spring.r2dbc.url:r2dbc:h2:mem:///" + randomDatabaseName(), - "spring.r2dbc.pool.max-size=15").run((context) -> { - assertThat(context).hasSingleBean(ConnectionFactory.class).hasSingleBean(ConnectionPool.class); + "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) + .hasSingleBean(R2dbcProperties.class); PoolMetrics poolMetrics = context.getBean(ConnectionPool.class).getMetrics().get(); assertThat(poolMetrics.getMaxAllocatedSize()).isEqualTo(15); + + 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); }); } From c48759bb2662d9b4eac78737b5f354c1ab75209f Mon Sep 17 00:00:00 2001 From: Rodolpho Couto Date: Tue, 16 Jun 2020 11:48:04 -0300 Subject: [PATCH 6/6] Fix formatting --- .../r2dbc/R2dbcAutoConfigurationTests.java | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) 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 59557cea1604..bb82c30a85ce 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 @@ -63,16 +63,13 @@ void configureWithUrlCreateConnectionPoolByDefault() { @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.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) .hasSingleBean(R2dbcProperties.class); PoolMetrics poolMetrics = context.getBean(ConnectionPool.class).getMetrics().get();