【问题标题】:How to enable connection pooling with spring-boot-starter-data-r2dbc?如何使用 spring-boot-starter-data-r2dbc 启用连接池?
【发布时间】:2020-12-15 09:22:17
【问题描述】:

我有一个具有 data-r2dbc 依赖项的 Spring Boot 应用程序。我使用 PostgreSQL 作为数据库。
所以我已经有了以下依赖项(gradle notation):

  • org.springframework.boot:spring-boot-starter-data-r2dbc:2.3.5.RELEASE
  • io.r2dbc:r2dbc-postgresql

我需要为 R2DBC 连接启用连接池。 不幸的是,我找不到任何详尽的手册来做到这一点。

根据这个相当过时的release notes我还必须添加io.r2dbc:r2dbc-pool 并使用spring.r2dbc.pool.* 属性来配置池。

另外,根据this reference,我不需要手动打开池,因为如果在类路径中找到r2dbc-pool,SB 将启用它。

够了还是我错过了什么?

【问题讨论】:

  • 你试过了吗?如果是这样,那什么不起作用。
  • 是的!并且该应用程序有效。但是,我不能确定连接池是否真的被使用了。是否有一些我可能会发现的特定日志?或者任何其他方式来验证这一点?
  • 如果您添加了依赖项,则有一个具有默认值的池,您可以通过 spring.r2dbc.pool 属性覆盖它。如文档中所述。
  • 您能否指出文档中的解释?此外,我刚刚发现依赖 io.r2dbc:r2dbc-pool 已经作为来自 spring-boot-starter-data-r2dbc:2.3.5.REALEASE 的传递依赖出现,这意味着实际上我不需要显式声明它(这也可以在这里看到:mvnrepository.com/artifact/org.springframework.boot/…
  • 本节说明它是基于 URL 配置的(您将需要它),其他一切都是可选的。

标签: java spring-boot spring-data-r2dbc r2dbc-postgresql


【解决方案1】:

回答我自己的问题。

TLDR

  • 拥有org.springframework.boot:spring-boot-starter-data-r2dbc:2.3.5.RELEASE 足以默认启用连接池
  • 无需显式添加io.r2dbc:r2dbc-postgresql
  • 在这种情况下,无需在 URL 中输入:pool:

一些详细的发现。 似乎有两种方法可以启用连接池:

  1. :pool: 驱动程序块放入URL,然后io.r2dbc.pool.PoolingConnectionFactoryProvider#create 将负责创建连接池。这在https://github.com/r2dbc/r2dbc-pool#getting-started 中进行了描述
  2. 在配置中没有spring.r2dbc.pool.enabled=false(这意味着默认情况下它的缺失被解释为true)。这样org.springframework.boot.autoconfigure.r2dbc.ConnectionFactoryConfigurations.Pool#connectionFactory 将创建一个连接池。我不确定,但它看起来像是对库特定 :pool: 选项的通用 Spring Boot 配置样式覆盖。

此选项是独立的,部分重叠,第二个优先。

第二个组件还评估 URL 中是否存在 :pool:(请参阅 org.springframework.boot.autoconfigure.r2dbc.ConnectionFactoryConfigurations.PooledConnectionFactoryCondition) 如果找到,它将连接池的创建委托给第一个。

还有一个特殊的结论——如果 URL 中有 :pool:,那么显式的 spring.r2dbc.pool.enabled=false 会导致创建连接池。因此,禁用池的唯一方法是同时在 URL 中添加 spring.r2dbc.pool.enabled=false 并省略 :pool:

【讨论】:

    【解决方案2】:

    以下代码对我有用

    String url = "r2dbc:postgres://user:password@hostname:5432/testdb?ApplicationName=myapp";
    ConnectionFactory ret= ConnectionFactories.get(url);
    
    ConnectionPoolConfiguration poolConfiguration = ConnectionPoolConfiguration.builder(ret)
                    .initialSize(5)                        .maxSize(10).maxIdleTime(Duration.ofMinutes(5)).build();
    
    ConnectionPool pool = new ConnectionPool(poolConfiguration);
    
    return pool;
    

    【讨论】:

      猜你喜欢
      • 2017-02-09
      • 1970-01-01
      • 1970-01-01
      • 2018-09-24
      • 2019-06-23
      • 1970-01-01
      • 2019-03-15
      • 2019-12-14
      • 2016-04-09
      相关资源
      最近更新 更多