欢迎来到天天文库
浏览记录
ID:62496406
大小:37.29 KB
页数:5页
时间:2021-05-10
《Springwebflux和阻塞与非阻塞JDBC介绍.docx》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、oaar遥因非xn#qe/v6uuds5Spring-5-webflux和阻塞与非阻塞JDBC期待良久的Spring5提供了更多对反应式的支持,接下来我们来研究一下如何使JDBC更加异步,以及这么做带来的问题SpringFramework5为函数式响应型编程带来了巨大的进步,你不需要使用ApplicationContext或几十个注释来启动和运行最简单的RESTAPI。Spring5将提供轻量级Web功能和被动的WebFlux支持,以帮助实现这种转换。这些新特性使得Java和spring5更适合构建反应式的web应用。为了实
2、现反应式web应用,根据反应式声明(TheReactiveManifesto)所说,应用必须是响应式,弹性的,可伸缩的,并且是消息驱动的。该列表中的最后一个条件一一消息驱动,导致了异步通信方式的大迁移,包括异步RPC和消息传递库、数据库驱动程序等等。关系型数据库(RDBMS)是非常强大和有用的。数据库供应商提供的JVM数据库访问的官方工具是实现JDBCAPI的驱动程序。但是JDBC被设计成阻塞并且每次数据库的调用都是使用线程的。你无法在API本身的方法或接口中找到能在另一个线程中获得查询结果的接口。还有一种观点认为,事物型数据
3、库不适合反应性概念:事务的概念并不适用于反应性的世界,因为它是关于阻塞资源的,而这正是你想要避免的。我部分同意这种观点。然而,这取决于你如何正确使用关系数据库。此外,在高度可伸缩的SQL数据库的新时代(如Amazon的Aurora或谷歌的CloudSpanner),通过将它们一起使用来实现高吞吐量是合适的。问题是,当我们在一个SQL数据库上构建反应式应用程序时,我们应该做什么?一种选择是使用完全非阻塞的替代SQL客户机。比如这里和这里。当然,这些驱动程序还没有得到数据库厂商的官方支持。此外,与成熟的基于jdbc的抽象(如Hib
4、ernate或jOOQ)相比,功能的吸弓I力要小得多。另一种想法是我从Scala中找到的。我们可以将阻塞调用分发到一个单独的线程池,以避免将阻塞和非阻塞调用混合在一起。这么做允许我们控制线程的总数量,并允许CPU在主执行上下文中提供非阻塞任务,并应用各种优化。假设我们有一个基于jdbc的实现,比如SpringDataJPA,它确实是阻塞的。importorg.springframework.data.repository.CrudRepository;publicinterfaceAddressRepositoryextend
5、sCrudRepository
6、ry=repository;5this.scheduler=scheduler;}publicMono>findAII(){returnasync(()->repository.findAII());}privateMonoasync(Callablecallable){returnMono.fromCallable(callable).publishOn(scheduler);}}我们的JDBC调度程序应该使用一个专用的线程池来配置,它的大小等于连接的数量。@Config
7、urationpublicclassSchedulerConfiguration{privatefinalIntegerconnectionPoolSize;publicSchedulerConfiguration(@Value("${spring.datasource.maximum-pool-size}")IntegerconnectionPoolSize){this.connectionPoolSize=connectionPoolSize;}@BeanpublicSchedulerjdbcScheduler(){ret
8、urnSchedulers.fromExecutor(Executors.newFixedThreadPool(connectionPoolSize));}}然而,这种方法也有困难。主要是事务管理。在JDBC中,事务只能在一个java.sql.Connection中进行。要想
此文档下载收益归作者所有