postgres r2dbc-pool的连接池大小

时间:2019-09-17 09:26:56

标签: java spring-webflux r2dbc

我无法使用spring-webflux和r2dbc(使用r2dbc-pool驱动程序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)

此外,连接数保持与初始大小相同。没有创建新的连接。

5 个答案:

答案 0 :(得分:2)

当由properties / yaml设置时,Spring Boot(至少2.3.4)关于池大小有一个棘手的“陷阱”。如果在数据库URL中包括“ pool”,则大小集(初始大小或最大大小)将无效,并且将使用r2dbc池的默认值10和10。

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

从PooledConnectionFactoryCondition文档中:

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

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

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

答案 1 :(得分:1)

好的,还应该为ConnectionFactoryOptions指定MAX_SIZE。否则,连接池大小仍保持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());

答案 2 :(得分:1)

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

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

请参见org.springframework.boot.autoconfigure.r2dbc.R2dbcProperties

答案 3 :(得分:1)

请注意,您可以使用发布版本0.8.4.RELEASE(最新版本)https://mvnrepository.com/artifact/io.r2dbc/r2dbc-postgresql/0.8.4.RELEASE,它不需要您实例化yourspinner.setSelection(first_item);

答案 4 :(得分: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