4

我无法使用 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);
  }
}

当我指定超过 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)

此外,连接数保持与初始大小相同。不会创建新连接。

4

5 回答 5

7

当由 properties/yaml 设置时,Spring Boot(至少 2.3.4)对池大小有一个棘手的“陷阱”。如果您在数据库 url 中包含“pool”,那么设置的大小(初始大小或最大大小)将没有任何影响,并且将使用 r2dbc 池的默认值 10 和 10。

这是由于ConnectionFactoryConfigurations.java中的 PooledConnectionFactoryCondition 在both 时失败spring.r2dbc.pool.enabled=true,如果 r2dbc-pool 依赖项位于类路径上,并且“pool”是spring.r2dbc.url属性的一部分。

来自 PooledConnectionFactoryCondition 文档:

检查是否请求了 ConnectionPool 的条件。如果池是通过配置选择加入的,并且 r2dbc url 不包含与池相关的选项,则条件匹配。

这反过来会导致没有创建 ConnectionPool bean。

跳过 r2dbc url 属性中的“pool”关键字并具有 r2dbc-pool 依赖项,然后您将获得正确配置的池。

于 2020-11-28T22:58:42.517 回答
3

请注意,您可以使用发布版本 0.8.4.RELEASE (这是最新的)https://mvnrepository.com/artifact/io.r2dbc/r2dbc-postgresql/0.8.4.RELEASE不需要您实例化一个ConnectionFactory

于 2020-08-25T08:02:35.643 回答
2

好的,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());
于 2019-09-17T10:34:55.400 回答
1

如果您使用的是 spring-boot-starter-data-r2dbc,那么最小值和最大值可在 application.properties 中配置

spring.r2dbc.pool.initialSize=2
spring.r2dbc.pool.maxSize=2

查看org.springframework.boot.autoconfigure.r2dbc.R2dbcProperties课程

于 2020-08-07T15:36:17.297 回答
1

以下是我对spring-boot-starter-data-r2dbc检查是否对您有帮助的配置:

spring:
  r2dbc:
    url: r2dbc:postgresql://127.0.0.1:5432/test?schema=public
    username: postgres
    password: postgres
    pool:
      name: TEST-POOL
      initial-size: 1
      max-size: 10
      max-idle-time: 30m
于 2021-07-06T12:50:44.953 回答