Nik*_*ita 7 java spring-webflux r2dbc
我无法使用 spring-webflux 和 r2dbc (使用 r2dbc-pool driver 0.8.0.M8)打开超过 10 个连接。我的配置如下:
@Configuration
public class PostgresConfig extends AbstractR2dbcConfiguration {
@Override
@Bean
public ConnectionFactory connectionFactory() {
ConnectionFactory connectionFactory = ConnectionFactories.get(ConnectionFactoryOptions.builder()
.option(DRIVER, "pool")
.option(PROTOCOL, "postgresql")
.option(HOST, host)
.option(USER, user)
.option(PASSWORD, password)
.option(DATABASE, database)
.build());
ConnectionPoolConfiguration configuration = ConnectionPoolConfiguration.builder(connectionFactory)
.maxIdleTime(Duration.ofMinutes(30))
.initialSize(initialSize)
.maxSize(maxSize)
.maxCreateConnectionTime(Duration.ofSeconds(1))
.build();
return new ConnectionPool(configuration);
}
}
Run Code Online (Sandbox Code Playgroud)
当我指定超过 10 个连接时,我会收到如下错误:
org.springframework.dao.DataAccessResourceFailureException:
Failed to obtain R2DBC Connection; nested exception is
java.util.concurrent.TimeoutException:
Did not observe any item or terminal signal within 1000ms in 'lift'
(and no fallback has been configured)
at org.springframework.data.r2dbc.connectionfactory.ConnectionFactoryUtils
.lambda$getConnection$0(ConnectionFactoryUtils.java:71)
Run Code Online (Sandbox Code Playgroud)
此外,连接数量保持与初始大小相同。不会创建新连接。
小智 9
Spring boot(至少 2.3.4)在通过properties/yaml设置池大小时有一个棘手的“陷阱”。如果您的数据库 URL 中包含“pool”,则大小设置(初始大小或最大大小)不会产生任何影响,并且将使用 r2dbc 池的默认值 10 和 10。
这是由于ConnectionFactoryConfigurations.java中的 PooledConnectionFactoryCondition在两者时失败spring.r2dbc.pool.enabled=true,如果 r2dbc-pool 依赖项位于类路径上,并且“pool”是属性的一部分,则失败spring.r2dbc.url。
来自 PooledConnectionFactoryCondition 文档:
检查是否请求 ConnectionPool 的条件。如果通过配置选择加入池且 r2dbc url 不包含池相关选项,则条件匹配。
这反过来又导致 ConnectionPool bean 未被创建。
跳过 r2dbc url 属性中的“pool”关键字并具有 r2dbc-pool 依赖项,然后您将获得正确配置的池。
好的,还应该为 指定 MAX_SIZE ConnectionFactoryOptions。否则连接池大小仍为 10。
import static io.r2dbc.pool.PoolingConnectionFactoryProvider.MAX_SIZE;
ConnectionFactory connectionFactory = ConnectionFactories.get(ConnectionFactoryOptions.builder()
.option(DRIVER, "pool")
.option(PROTOCOL, "postgresql")
.option(HOST, host)
.option(USER, user)
.option(PASSWORD, password)
.option(DATABASE, database)
.option(MAX_SIZE, maxSize)
.build());
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
21938 次 |
| 最近记录: |