Springwebflux和阻塞与非阻塞JDBC介绍.docx

Springwebflux和阻塞与非阻塞JDBC介绍.docx

ID:62496406

大小:37.29 KB

页数:5页

时间:2021-05-10

Springwebflux和阻塞与非阻塞JDBC介绍.docx_第1页
Springwebflux和阻塞与非阻塞JDBC介绍.docx_第2页
Springwebflux和阻塞与非阻塞JDBC介绍.docx_第3页
Springwebflux和阻塞与非阻塞JDBC介绍.docx_第4页
Springwebflux和阻塞与非阻塞JDBC介绍.docx_第5页
资源描述:

《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{}我们可以让它异步执行,并分发给专用的线程池。@ServicepublicclassAddressService{privatefinalAddressRepositoryrepository;privatefinalSchedulerscheduler;publicAddressRouter(AddressRepositoryrepository,@Qualifier("jdbcScheduler")Schedulerscheduler){this.reposito

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中进行。要想

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。