如何使用 spring-boot-starter-data-r2dbc 启用连接池?

How to enable connection pooling with spring-boot-starter-data-r2dbc?

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

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

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

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

够了吗还是我错过了什么?

回答我自己的问题。

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. 中有描述
  3. 在配置中没有 spring.r2dbc.pool.enabled=false(这意味着默认情况下它的缺失被解释为 true)。这样,连接池将由 org.springframework.boot.autoconfigure.r2dbc.ConnectionFactoryConfigurations.Pool#connectionFactory 创建。我不确定,但它看起来像是对库特定 :pool: 选项的通用 Spring 引导配置样式覆盖。

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

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

还有一个奇怪的结论 - 如果 URL 中有 :pool:,则显式 spring.r2dbc.pool.enabled=false 无论如何都会创建连接池。因此,禁用池化的唯一方法是在 URL 中同时设置 spring.r2dbc.pool.enabled=false 和省略 :pool:

下面的代码对我有用

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;