如何使用 spring-boot-starter-data-r2dbc 启用连接池?
How to enable connection pooling with spring-boot-starter-data-r2dbc?
我有一个 Spring 依赖于 data-r2dbc 的启动应用程序。我使用 PostgreSQL 作为数据库。
所以我已经有了以下依赖项(gradle 符号):
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 将启用它。
够了吗还是我错过了什么?
回答我自己的问题。
TLDR
org.springframework.boot:spring-boot-starter-data-r2dbc:2.3.5.RELEASE
足以默认启用连接池
- 无需显式添加
io.r2dbc:r2dbc-postgresql
- 在这种情况下 URL 中无需放入
:pool:
一些详细的发现。
似乎有两种方法可以启用连接池:
- 将
:pool:
驱动程序块放入 URL,然后 io.r2dbc.pool.PoolingConnectionFactoryProvider#create
将负责创建连接池。这在 https://github.com/r2dbc/r2dbc-pool#getting-started 中有描述
- 在配置中没有
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;
我有一个 Spring 依赖于 data-r2dbc 的启动应用程序。我使用 PostgreSQL 作为数据库。
所以我已经有了以下依赖项(gradle 符号):
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 将启用它。
够了吗还是我错过了什么?
回答我自己的问题。
TLDR
org.springframework.boot:spring-boot-starter-data-r2dbc:2.3.5.RELEASE
足以默认启用连接池- 无需显式添加
io.r2dbc:r2dbc-postgresql
- 在这种情况下 URL 中无需放入
:pool:
一些详细的发现。 似乎有两种方法可以启用连接池:
- 将
:pool:
驱动程序块放入 URL,然后io.r2dbc.pool.PoolingConnectionFactoryProvider#create
将负责创建连接池。这在 https://github.com/r2dbc/r2dbc-pool#getting-started 中有描述
- 在配置中没有
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;