r2dbc配置多数据源

R2dbc配置多数据源问题

根据官网配置r2dbc 连接mysql多数据源所遇到的问题
pom配置可以参考官网,
不过我这样配置会报错 我并没有这样配置
将以下内容添加到 pom.xml 文件dependencies元素:

<dependencyManagement>
  <dependencies>
    <dependency>
      <groupId>io.r2dbc</groupId>
      <artifactId>r2dbc-bom</artifactId>
      <version>${r2dbc-releasetrain.version}</version>
      <type>pom</type>
      <scope>import</scope>
    </dependency>
  </dependencies>
</dependencyManagement>

<dependencies>

  <!-- other dependency elements omitted -->

  <dependency>
    <groupId>org.springframework.data</groupId>
    <artifactId>spring-data-r2dbc</artifactId>
    <version>1.3.3</version>
  </dependency>

  <!-- a R2DBC driver -->
  <dependency>
    <groupId>io.r2dbc</groupId>
    <artifactId>r2dbc-h2</artifactId>
    <version>Arabba-SR10</version>
  </dependency>

</dependencies>

将 pom.xml 中 Spring 的版本改为

<spring-framework.version>5.3.9</spring-framework.version>

将 Maven 的 Spring Milestone 存储库的以下位置添加到您的位置pom.xml,使其与您的元素处于同一级别:

<repositories>
  <repository>
    <id>spring-milestone</id>
    <name>Spring Maven MILESTONE Repository</name>
    <url>https://repo.spring.io/libs-milestone</url>
  </repository>
</repositories>

以下是官网原话
当使用多个可能不同的数据库时,您的应用程序将需要不同的配置方法。所提供的AbstractR2dbcConfiguration支持类假定单个ConnectionFactory从中Dialect得到的。话虽如此,您需要自己定义一些 bean 来配置 Spring Data R2DBC 以处理多个数据库。

R2DBC 存储库需要R2dbcEntityOperations实现存储库。无需使用即可扫描存储库的简单配置AbstractR2dbcConfiguration如下所示:
但是有一个问题 官方的这个显示返回的类型是一个Operations 是他的接口 导致spring无法注入这个对象 不知道是bug还是版本问题。会出现

Cannot determine database’s type as ConnectionFactory is not options-capable
无法确定数据库的类型,因为ConnectionFactory不支持选项

在这里插入图片描述

所以我们将返回类型改为R2dbcEntityTemplate 即可

@Configuration
@EnableR2dbcRepositories(basePackages = "com.acme.mysql", entityOperationsRef = "mysqlR2dbcEntityOperations")
static class MySQLConfiguration {

    @Bean
    @Qualifier("mysql")
    public ConnectionFactory mysqlConnectionFactory() {
        return}

    @Bean
    public R2dbcEntityTemplate mysqlR2dbcEntityOperations(@Qualifier("mysql") ConnectionFactory connectionFactory) {

        DatabaseClient databaseClient = DatabaseClient.create(connectionFactory);

        return new R2dbcEntityTemplate(databaseClient, MySqlDialect.INSTANCE);
    }
}

这样我们就可以灵活的切换数据源了
例如:
cofig配置文件

@Configuration
@EnableR2dbcRepositories(basePackages = "webflux.demo", entityOperationsRef = "mysqlR2dbcEntityOperations")
public class config {

    @Bean("mysql")
    public ConnectionFactory mysqlConnectionFactory() {
        ConnectionFactoryOptions options = builder()
                .option(DRIVER, "mysql")
                .option(HOST, "")
                .option(PORT, 3306)
                .option(USER, "")
                .option(PASSWORD, "")
                .option(SSL, false)
                .option(DATABASE, "nlp")
                .build();
        ConnectionFactory connectionFactory = ConnectionFactories.get(options);
        return connectionFactory;
    }

    @Bean("ecs")
    public ConnectionFactory mysqlConnectionFactory1(){
        ConnectionFactoryOptions options = builder()
                .option(DRIVER, "mysql")
                .option(HOST, "")
                .option(PORT, 3306)
                .option(USER, "")
                .option(PASSWORD, "")
                .option(SSL, false)
                .option(DATABASE, "r2dbc")
                .build();
        ConnectionFactory connectionFactory = ConnectionFactories.get(options);
        return connectionFactory;
    }

    @Bean("nlp")
    public R2dbcEntityTemplate mysqlR2dbcEntityOperations(@Qualifier("mysql") ConnectionFactory connectionFactory) {

        DatabaseClient databaseClient = DatabaseClient.create(connectionFactory);
        return new R2dbcEntityTemplate(databaseClient, MySqlDialect.INSTANCE);
    }

    @Bean("r2dbc")
    public R2dbcEntityTemplate  mysqlR2dbcEntityOperations1(@Qualifier("ecs") ConnectionFactory connectionFactory) {

        DatabaseClient databaseClient = DatabaseClient.create(connectionFactory);
        return new R2dbcEntityTemplate(databaseClient, MySqlDialect.INSTANCE);
    }
}

测试
我们用Qualifier指定哪个数据源 然后就可以使用

@RestController
@RequestMapping("/demo")
public class DemoController {
 	@Autowired
    @Qualifier("nlp")
    R2dbcEntityTemplate nlp;

    @Autowired
    @Qualifier("r2dbc")
    R2dbcEntityTemplate user;
	
	@RequestMapping("/a")
    public Mono<List<User>> a() throws InterruptedException {
        Mono<List<User>> listMono = user.select(User.class).all().collectList();
        return listMono;
    }	
	@RequestMapping("/cc")
    public Mono<Video> aaa() {
        Mono<Video> one = nlp.select(Video.class).from("video")
        	.matching(Query.query(Criteria.where("video_id").is("37"))).one();
        return one;
    }
}

测试结果
以下是2个不同的数据库
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在Spring WebFlux中使用R2DBC连接MySQL并集成Flyway,可以按照以下步骤进行操作: 1. 在pom.xml中添加所需的依赖项: ```xml <!-- Spring WebFlux --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-webflux</artifactId> </dependency> <!-- R2DBC MySQL 驱动 --> <dependency> <groupId>dev.miku</groupId> <artifactId>r2dbc-mysql</artifactId> <version>0.8.2.RELEASE</version> </dependency> <!-- Flyway --> <dependency> <groupId>org.flywaydb</groupId> <artifactId>flyway-core</artifactId> </dependency> ``` 2. 在application.properties中配置R2DBC连接和Flyway: ```properties # R2DBC MySQL 连接配置 spring.r2dbc.url=r2dbc:mysql://localhost:3306/test spring.r2dbc.username=root spring.r2dbc.password=root # Flyway 配置 flyway.locations=classpath:db/migration flyway.clean-disabled=false flyway.baseline-on-migrate=true ``` 3. 创建数据库迁移脚本文件,存放在`src/main/resources/db/migration`目录下。例如,创建一个名为`V1__init.sql`的脚本文件,用于初始化数据库: ```sql CREATE TABLE `user` ( `id` INT PRIMARY KEY, `name` VARCHAR(50) NOT NULL, `age` INT NOT NULL ); ``` 4. 在Spring Boot应用程序中创建一个数据访问对象(DAO)来处理与数据库的交互。可以使用R2DBC提供的`DatabaseClient`或Spring Data R2DBC来简化数据库访问。 5. 启动应用程序,Flyway将自动执行数据库迁移脚本,初始化数据库。 注意:R2DBC是非阻塞的数据库访问方式,与传统的JDBC和Spring Data JPA不同,需要使用异步的方式进行操作。确保代码中的异步操作正确处理。 希望对你有所帮助!如有其他问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值