Skip to content

Commit 0d41596

Browse files
rodolphocoutosnicoll
authored andcommitted
Add additional properties to configure R2DBC pool
See gh-21219
1 parent 972aab1 commit 0d41596

File tree

4 files changed

+86
-4
lines changed

4 files changed

+86
-4
lines changed

spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/r2dbc/ConnectionFactoryConfigurations.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@
4343
*
4444
* @author Mark Paluch
4545
* @author Stephane Nicoll
46+
* @author Rodolpho S. Couto
4647
*/
4748
abstract class ConnectionFactoryConfigurations {
4849

@@ -69,7 +70,11 @@ ConnectionPool connectionFactory(R2dbcProperties properties, ResourceLoader reso
6970
customizers.orderedStream().collect(Collectors.toList()));
7071
R2dbcProperties.Pool pool = properties.getPool();
7172
ConnectionPoolConfiguration.Builder builder = ConnectionPoolConfiguration.builder(connectionFactory)
72-
.maxSize(pool.getMaxSize()).initialSize(pool.getInitialSize()).maxIdleTime(pool.getMaxIdleTime());
73+
.initialSize(pool.getInitialSize()).maxSize(pool.getMaxSize()).maxIdleTime(pool.getMaxIdleTime())
74+
.maxLifeTime(pool.getMaxLifeTime()).maxAcquireTime(pool.getMaxAcquireTime())
75+
.maxCreateConnectionTime(pool.getMaxCreateConnectionTime())
76+
.validationDepth(pool.getValidationDepth());
77+
7378
if (StringUtils.hasText(pool.getValidationQuery())) {
7479
builder.validationQuery(pool.getValidationQuery());
7580
}

spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/r2dbc/R2dbcProperties.java

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@
2121
import java.util.Map;
2222
import java.util.UUID;
2323

24+
import io.r2dbc.spi.ValidationDepth;
25+
2426
import org.springframework.boot.context.properties.ConfigurationProperties;
2527

2628
/**
@@ -29,6 +31,7 @@
2931
* @author Mark Paluch
3032
* @author Andreas Killaitis
3133
* @author Stephane Nicoll
34+
* @author Rodolpho S. Couto
3235
* @since 2.3.0
3336
*/
3437
@ConfigurationProperties(prefix = "spring.r2dbc")
@@ -138,6 +141,21 @@ public static class Pool {
138141
*/
139142
private Duration maxIdleTime = Duration.ofMinutes(30);
140143

144+
/**
145+
* Max lifetime.
146+
*/
147+
private Duration maxLifeTime = Duration.ofMinutes(0L);
148+
149+
/**
150+
* Max acquire time.
151+
*/
152+
private Duration maxAcquireTime = Duration.ofMinutes(0L);
153+
154+
/**
155+
* Max create connection time.
156+
*/
157+
private Duration maxCreateConnectionTime = Duration.ofMinutes(0L);
158+
141159
/**
142160
* Initial connection pool size.
143161
*/
@@ -153,6 +171,11 @@ public static class Pool {
153171
*/
154172
private String validationQuery;
155173

174+
/**
175+
* Validation depth.
176+
*/
177+
private ValidationDepth validationDepth = ValidationDepth.LOCAL;
178+
156179
public Duration getMaxIdleTime() {
157180
return this.maxIdleTime;
158181
}
@@ -161,6 +184,30 @@ public void setMaxIdleTime(Duration maxIdleTime) {
161184
this.maxIdleTime = maxIdleTime;
162185
}
163186

187+
public Duration getMaxLifeTime() {
188+
return this.maxLifeTime;
189+
}
190+
191+
public void setMaxLifeTime(Duration maxLifeTime) {
192+
this.maxLifeTime = maxLifeTime;
193+
}
194+
195+
public Duration getMaxAcquireTime() {
196+
return this.maxAcquireTime;
197+
}
198+
199+
public void setMaxAcquireTime(Duration maxAcquireTime) {
200+
this.maxAcquireTime = maxAcquireTime;
201+
}
202+
203+
public Duration getMaxCreateConnectionTime() {
204+
return this.maxCreateConnectionTime;
205+
}
206+
207+
public void setMaxCreateConnectionTime(Duration maxCreateConnectionTime) {
208+
this.maxCreateConnectionTime = maxCreateConnectionTime;
209+
}
210+
164211
public int getInitialSize() {
165212
return this.initialSize;
166213
}
@@ -185,6 +232,14 @@ public void setValidationQuery(String validationQuery) {
185232
this.validationQuery = validationQuery;
186233
}
187234

235+
public ValidationDepth getValidationDepth() {
236+
return this.validationDepth;
237+
}
238+
239+
public void setValidationDepth(ValidationDepth validationDepth) {
240+
this.validationDepth = validationDepth;
241+
}
242+
188243
}
189244

190245
}

spring-boot-project/spring-boot-autoconfigure/src/main/resources/META-INF/additional-spring-configuration-metadata.json

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1468,6 +1468,10 @@
14681468
"type": "java.lang.Boolean",
14691469
"description": "Whether pooling is enabled. Enabled automatically if \"r2dbc-pool\" is on the classpath."
14701470
},
1471+
{
1472+
"name": "spring.r2dbc.pool.validationDepth",
1473+
"defaultValue": "local"
1474+
},
14711475
{
14721476
"name": "spring.rabbitmq.cache.connection.mode",
14731477
"defaultValue": "channel"

spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/r2dbc/R2dbcAutoConfigurationTests.java

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818

1919
import java.net.URL;
2020
import java.net.URLClassLoader;
21+
import java.time.Duration;
2122
import java.util.UUID;
2223
import java.util.function.Function;
2324

@@ -28,6 +29,7 @@
2829
import io.r2dbc.pool.PoolMetrics;
2930
import io.r2dbc.spi.ConnectionFactory;
3031
import io.r2dbc.spi.Option;
32+
import io.r2dbc.spi.ValidationDepth;
3133
import org.junit.jupiter.api.Test;
3234

3335
import org.springframework.beans.factory.BeanCreationException;
@@ -61,11 +63,27 @@ void configureWithUrlCreateConnectionPoolByDefault() {
6163

6264
@Test
6365
void configureWithUrlAndPoolPropertiesApplyProperties() {
64-
this.contextRunner.withPropertyValues("spring.r2dbc.url:r2dbc:h2:mem:///" + randomDatabaseName(),
65-
"spring.r2dbc.pool.max-size=15").run((context) -> {
66-
assertThat(context).hasSingleBean(ConnectionFactory.class).hasSingleBean(ConnectionPool.class);
66+
this.contextRunner
67+
.withPropertyValues("spring.r2dbc.url:r2dbc:h2:mem:///" + randomDatabaseName(),
68+
"spring.r2dbc.pool.initial-size=5", "spring.r2dbc.pool.max-size=15",
69+
"spring.r2dbc.pool.max-idle-time=1ms", "spring.r2dbc.pool.max-life-time=2s",
70+
"spring.r2dbc.pool.max-acquire-time=3m", "spring.r2dbc.pool.max-create-connection-time=4h",
71+
"spring.r2dbc.pool.validation-query=SELECT 1", "spring.r2dbc.pool.validation-depth=remote")
72+
.run((context) -> {
73+
assertThat(context).hasSingleBean(ConnectionFactory.class).hasSingleBean(ConnectionPool.class)
74+
.hasSingleBean(R2dbcProperties.class);
6775
PoolMetrics poolMetrics = context.getBean(ConnectionPool.class).getMetrics().get();
6876
assertThat(poolMetrics.getMaxAllocatedSize()).isEqualTo(15);
77+
78+
R2dbcProperties properties = context.getBean(R2dbcProperties.class);
79+
assertThat(properties.getPool().getInitialSize()).isEqualTo(5);
80+
assertThat(properties.getPool().getMaxSize()).isEqualTo(15);
81+
assertThat(properties.getPool().getMaxIdleTime()).isEqualTo(Duration.ofMillis(1));
82+
assertThat(properties.getPool().getMaxLifeTime()).isEqualTo(Duration.ofSeconds(2));
83+
assertThat(properties.getPool().getMaxAcquireTime()).isEqualTo(Duration.ofMinutes(3));
84+
assertThat(properties.getPool().getMaxCreateConnectionTime()).isEqualTo(Duration.ofHours(4));
85+
assertThat(properties.getPool().getValidationQuery()).isEqualTo("SELECT 1");
86+
assertThat(properties.getPool().getValidationDepth()).isEqualTo(ValidationDepth.REMOTE);
6987
});
7088
}
7189

0 commit comments

Comments
 (0)