+-
Spring webflux和从数据库中读取
Spring 5为 webflux引入了其他API的反应式编程风格.我自己也很新,并且想知道将数据库的同步调用包装到Flux或Mono中是否有意义?如果是,这是这样做的方式:

@RestController
public class HomeController {

    private MeasurementRepository repository;

    public HomeController(MeasurementRepository repository){
        this.repository = repository;
    }

    @GetMapping(value = "/v1/measurements")
    public Flux<Measurement> getMeasurements() {
        return Flux.fromIterable(repository.findByFromDateGreaterThanEqual(new Date(1486980000L)));
    }

}

是否有类似异步CrudRepository的东西?我找不到它.

最佳答案
一种选择是使用完全非阻塞的备用SQL客户端.一些例子包括:
https://github.com/mauricio/postgresql-async或 https://github.com/finagle/roc.当然,数据库供应商尚未正式支持这些驱动程序.此外,与基于JDBC的成熟抽象(如Hibernate或jOOQ)相比,功能的吸引力要小得多.

从Scala世界来到我的另一个想法.我们的想法是将阻塞调用分配到隔离的ThreadPool中,而不是将阻塞和非阻塞调用混合在一起.这将允许我们控制线程的总数,并让CPU在主执行上下文中提供非阻塞任务,并进行一些潜在的优化.
假设我们有基于JDBC的实现,例如确实阻塞的Spring Data JPA,我们可以使它的执行异步并在专用线程池上调度.

@RestController
public class HomeController {

    private final MeasurementRepository repository;
    private final Scheduler scheduler;

    public HomeController(MeasurementRepository repository, @Qualifier("jdbcScheduler") Scheduler scheduler) {
        this.repository = repository;
        this.scheduler = scheduler;
    }

    @GetMapping(value = "/v1/measurements")
    public Flux<Measurement> getMeasurements() {
        return Mono.fromCallable(() -> repository.findByFromDateGreaterThanEqual(new Date(1486980000L))).publishOn(scheduler);
    }

}

我们的JDBC调度程序应该使用专用线程池进行配置,其中大小计数等于连接数.

@Configuration
public class SchedulerConfiguration {
    private final Integer connectionPoolSize;

    public SchedulerConfiguration(@Value("${spring.datasource.maximum-pool-size}") Integer connectionPoolSize) {
        this.connectionPoolSize = connectionPoolSize;
    }

    @Bean
    public Scheduler jdbcScheduler() {
        return Schedulers.fromExecutor(Executors.newFixedThreadPool(connectionPoolSize));
    }

}

但是,这种方法存在困难.主要是交易管理.在JDBC中,事务只能在单个java.sql.Connection中进行.要在一个事务中进行多个操作,他们必须共享连接.如果我们想在它们之间进行一些计算,我们必须保持连接.这不是很有效,因为我们在两者之间进行计算时保持有限数量的连接空闲.

这种异步JDBC包装器的想法并不新鲜,并且已在Scala库Slick 3中实现.最后,非阻塞JDBC可能会出现在Java路线图中.正如它在2016年9月在JavaOne上宣布的那样,我们可能会在Java 10中看到它.

点击查看更多相关文章

转载注明原文:Spring webflux和从数据库中读取 - 乐贴网