R2DBC数据库客户端未调用doOnSuccess或终止嵌套调用

该代码已到达“填充要执行的迁移”日志。但是,没有AAA,EEE和CCC日志都可以访问,因此doOnSuccess内部没有任何代码正在运行。对于我如何解决此问题的任何帮助,将不胜感激。

databaseclient.execute().sql("CREATE TABLE IF NOT EXISTS " + TRACKING_TABLE +" ("+PROPERTY_SERVICE+ " varchar(255) NOT NULL," + PROPERTY_VERSION+" float(4) NOT NULL," +PROPERTY_SCRIPT+" varchar(255) NOT NULL);")
                .then()
                .concatWith(databaseclient.execute().sql("CREATE TABLE IF NOT EXISTS " + TRACKING_SEAL_TABLE+" ("+PROPERTY_SERVICE+ " varchar(255) NOT NULL,"+ PROPERTY_VERSION+" float(4) NOT NULL);")
                        .then())
                .doOnComplete(() -> {
                    log.info("Populating migrations to be executed");// reaches here
                    databaseclient.select().from(TRACKING_SEAL_TABLE).as(MigrationSealDetails.class).fetch().all()       .collectList()
                            .map()//mapping function
                            .doOnError(e -> log.log(Level.SEVERE,"EEE",e))
                            .doOnSuccess(highestSealPerService -> {
                                log.info("AAA");
                                databaseclient.select().from(TRACKING_TABLE).as(MigrationDetails.class).fetch().all()
                                        .collectList()
                                        .doOnSuccess(migrationsExecuted -> {
                                            // other code
                                        }).block();
                            }).block();
                }).blockLast();
        log.info("CCC");
zzcool0102 回答:R2DBC数据库客户端未调用doOnSuccess或终止嵌套调用

  

log.info(“ CCC”);

在任何情况下都应调用它,因为它是所有响应调用之后的最后一个操作。 我认为您的代码陷入僵局的问题。 您处于doOnComplete中的反应式线程中。然后,您执行另一个阻塞操作,该操作将阻塞当前的响应线程,并且由于无法完成任何操作,您将收到死锁。

如果您编写.block(),请仅使用纯JDBC,不要使用R2DBC。

本文链接:https://www.f2er.com/3165358.html

大家都在问