百度搜不到公司网站,门户网站与网站的区别,烟台网站建设 烟台网亿网络公司,网站添加邮件发送怎么做Java中配置两个r2db连接不同的数据库在实际项目中不可避免的存在使用两个数据库的情况#xff0c;下面将系统地讲解相关配置方案#xff0c;包含配置文件、数据库配置类、注解原理、常见错误排查等维度#x1f9e9; 一、配置文件说明#xff08;application.yml#xff09…Java中配置两个r2db连接不同的数据库在实际项目中不可避免的存在使用两个数据库的情况下面将系统地讲解相关配置方案包含配置文件、数据库配置类、注解原理、常见错误排查等维度一、配置文件说明application.yml
spring:r2dbc:url: r2dbc:pool:postgresql://localhost:5432/db1username: user1password: pass1pool:initial-size: 5max-size: 20secondary:r2dbc:url: r2dbc:postgresql://localhost:5432/your_dbusername: your_userpassword: your_passwordpool:initial-size: 3max-size: 15说明
spring.r2dbc: Spring Boot 默认加载的主数据源配置。secondary.r2dbc: 自定义的第二数据源。不会自动装配需要你手动配置 Bean。r2dbc:pool: 和 r2dbc: 区别
r2dbc:pool: 表示使用 连接池推荐r2dbc: 表示原始的非连接池驱动⚙️ 二、主数据源配置类 PrimaryDatabaseConfig
Configuration
public class PrimaryDatabaseConfig {Value(${spring.r2dbc.url})private String url;Value(${spring.r2dbc.username})private String username;Value(${spring.r2dbc.password})private String password;PrimaryBean(name primaryConnectionFactory)public ConnectionFactory primaryConnectionFactory() {return ConnectionFactories.get(ConnectionFactoryOptions.parse(url).mutate().option(ConnectionFactoryOptions.USER, username).option(ConnectionFactoryOptions.PASSWORD, password).build());}PrimaryBean(name primaryTemplate)public R2dbcEntityTemplate primaryTemplate(Qualifier(primaryConnectionFactory) ConnectionFactory connectionFactory) {return new R2dbcEntityTemplate(connectionFactory);}
}✅ 核心点
Primary: 表示这个是默认优先注入的 Bean。在有多个候选 Bean 时优先使用这个。ConnectionFactory: R2DBC 中类似 JDBC 的 DataSource。R2dbcEntityTemplate: 相当于 JdbcTemplate提供操作数据库的工具类基于反应式编程。
⚙️ 三、第二数据源配置类 SecondaryDatabaseConfig
Configuration
public class SecondaryDatabaseConfig {Value(${secondary.r2dbc.url})private String url;Value(${secondary.r2dbc.username})private String username;Value(${secondary.r2dbc.password})private String password;Bean(name secondaryConnectionFactory)public ConnectionFactory secondaryConnectionFactory() {return ConnectionFactories.get(ConnectionFactoryOptions.parse(url).mutate().option(ConnectionFactoryOptions.USER, username).option(ConnectionFactoryOptions.PASSWORD, password).build());}Bean(name secondaryTemplate)public R2dbcEntityTemplate secondaryTemplate(Qualifier(secondaryConnectionFactory) ConnectionFactory connectionFactory) {return new R2dbcEntityTemplate(connectionFactory);}
}✅ 核心点
没有 Primary所以必须使用 Qualifier(“secondaryTemplate”) 指定注入路径读取的是 secondary.r2dbc.xxx需要明确在配置文件中写对。四、使用方式示例
Service
public class MyService {private final R2dbcEntityTemplate primaryTemplate;private final R2dbcEntityTemplate secondaryTemplate;public MyService(Qualifier(primaryTemplate) R2dbcEntityTemplate primaryTemplate,Qualifier(secondaryTemplate) R2dbcEntityTemplate secondaryTemplate) {this.primaryTemplate primaryTemplate;this.secondaryTemplate secondaryTemplate;}public MonoVoid test() {return primaryTemplate.getDatabaseClient().sql(SELECT 1).fetch().rowsUpdated().then(secondaryTemplate.getDatabaseClient().sql(SELECT 2).fetch().rowsUpdated()).then();}
}常见错误排查问题描述原因解决方法Qualifier(secondaryTemplate) 提示找不到Spring 容器未识别 Bean 名称确保 Bean(name ...) 名称一致primaryTemplate 和 secondaryTemplate 互相冲突缺失 Primary给默认数据源添加 Primary自动装配失败R2dbcEntityTemplate 没有显式注入必须手动注册多个数据源对应的 R2dbcEntityTemplateConnectionFactories.get() 报错URL 配置错误或缺失驱动检查 url 格式是否是 r2dbc:postgresql:并确保依赖添加了 R2DBC Postgres 驱动 五、依赖配置
确保你添加了以下依赖
dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-data-r2dbc/artifactId
/dependencydependencygroupIdio.r2dbc/groupIdartifactIdr2dbc-postgresql/artifactId
/dependency!-- 可选连接池支持 --
dependencygroupIdio.r2dbc/groupIdartifactIdr2dbc-pool/artifactId
/dependency小贴士ConnectionFactoryOptions.parse() 用于解析字符串并构建连接选项可组合 .mutate() 来动态设置用户名和密码。推荐使用 r2dbc:pool:postgresql避免创建太多连接。如果你需要统一管理多个 R2dbcEntityTemplate可封装一个工具类或注入 MapString, R2dbcEntityTemplate