From b7381ac6bb269b929fcbcddb10ea165ac2ce6da7 Mon Sep 17 00:00:00 2001 From: Asmir Mustafic Date: Thu, 12 Dec 2024 22:32:09 +0100 Subject: [PATCH] Prepare connection pool. We now prepare the pool when the connection factory is started respective the pool has been instantiated. Closes #3072 --- .../LettucePoolingConnectionProvider.java | 15 ++++++++++++-- ...ucePoolingConnectionProviderUnitTests.java | 20 +++++++++++++++++++ 2 files changed, 33 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/springframework/data/redis/connection/lettuce/LettucePoolingConnectionProvider.java b/src/main/java/org/springframework/data/redis/connection/lettuce/LettucePoolingConnectionProvider.java index 88ef7561a..57d3ad084 100644 --- a/src/main/java/org/springframework/data/redis/connection/lettuce/LettucePoolingConnectionProvider.java +++ b/src/main/java/org/springframework/data/redis/connection/lettuce/LettucePoolingConnectionProvider.java @@ -55,6 +55,7 @@ import org.springframework.util.Assert; * * @author Mark Paluch * @author Christoph Strobl + * @author Asmir Mustafic * @since 2.0 * @see #getConnection(Class) */ @@ -90,8 +91,18 @@ class LettucePoolingConnectionProvider implements LettuceConnectionProvider, Red public > T getConnection(Class connectionType) { GenericObjectPool> pool = pools.computeIfAbsent(connectionType, poolType -> { - return ConnectionPoolSupport.createGenericObjectPool(() -> connectionProvider.getConnection(connectionType), - poolConfig, false); + + GenericObjectPool> newPool = ConnectionPoolSupport + .createGenericObjectPool(() -> connectionProvider.getConnection(connectionType), poolConfig, false); + + try { + newPool.preparePool(); + + } catch (Exception ex) { + throw new PoolException("Could not prepare the pool", ex); + } + + return newPool; }); try { diff --git a/src/test/java/org/springframework/data/redis/connection/lettuce/LettucePoolingConnectionProviderUnitTests.java b/src/test/java/org/springframework/data/redis/connection/lettuce/LettucePoolingConnectionProviderUnitTests.java index bc18a584c..1722319ff 100644 --- a/src/test/java/org/springframework/data/redis/connection/lettuce/LettucePoolingConnectionProviderUnitTests.java +++ b/src/test/java/org/springframework/data/redis/connection/lettuce/LettucePoolingConnectionProviderUnitTests.java @@ -20,6 +20,7 @@ import static org.mockito.Mockito.*; import io.lettuce.core.api.StatefulRedisConnection; import io.lettuce.core.api.async.RedisAsyncCommands; +import org.apache.commons.pool2.impl.GenericObjectPoolConfig; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; @@ -27,11 +28,13 @@ import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; import org.mockito.junit.jupiter.MockitoSettings; import org.mockito.quality.Strictness; +import org.springframework.data.redis.connection.lettuce.LettucePoolingClientConfiguration.LettucePoolingClientConfigurationBuilder; /** * Unit tests for {@link LettucePoolingConnectionProvider}. * * @author Mark Paluch + * @author Asmir Mustafic */ @ExtendWith(MockitoExtension.class) @MockitoSettings(strictness = Strictness.LENIENT) @@ -70,4 +73,21 @@ class LettucePoolingConnectionProviderUnitTests { verify(commandsMock).discard(); } + + @Test + void shouldPrepareThePool() { + + GenericObjectPoolConfig poolConfig = new GenericObjectPoolConfig(); + poolConfig.setMinIdle(5); + poolConfig.setMaxIdle(8); + poolConfig.setMaxTotal(10); + + LettucePoolingClientConfiguration config = new LettucePoolingClientConfigurationBuilder().poolConfig(poolConfig) + .build(); + + LettucePoolingConnectionProvider provider = new LettucePoolingConnectionProvider(connectionProviderMock, config); + + provider.getConnection(StatefulRedisConnection.class); + verify(connectionProviderMock, times(5)).getConnection(any()); + } }