java - 异步数据库库是如何实现的?

标签 java multithreading asynchronous reactive-programming nonblocking

一般来说,人们对异步处理请求的响应式(Reactive)异步代码(play、akka、netty 等)进行了广泛的宣传。 以这种方式执行代码时,建议您不要阻塞并尽可能使用异步库。 如果我理解正确的话,这种方式不是为每个请求创建一个线程,而是为这些库带来的多个执行部分(请求的主要处理、服务执行器的异步调用、异步数据库驱动程序执行器等)提供线程执行器。 )

这种方式执行最终会分成多个线程(=多个执行器)。 这些异步库是如何实现的以便带来任何好处?因为在异步数据库驱动程序具有运行一个仅等待数据库应答的线程的执行器的场景中,我认为它不会带来任何好处。我们最终会等待,仅仅通过创建额外的线程来等待并没有任何帮助。或者是吗?

最佳答案

我可以根据我写作的经验告诉你https://github.com/jasync-sql/jasync-sql这是一个在底层使用 netty 的异步 mysql 驱动程序。
首先,当您对数据库执行 sql 查询时,没有线程被阻塞。相反,netty 使用事件循环和 java nio 让一个线程在多个套接字上监听而不发生阻塞。
如果您想了解有关事件循环的一般信息,这是一个非常好的视频:https://www.youtube.com/watch?v=8aGhZQkoFbQ

根据我的理解,在理想的应用程序中,线程数将与核心数相同,并且它们永远不会阻塞 io,只会执行 CPU 工作(计算)。因此,在理想的世界中,您将使用 ForkJoinPool 来处理所有事情。在实际场景中,我从未见过这样做的应用程序,也许只有 super 调优的服务。相反,您通常在某些池中拥有更多线程,但它们通常等待工作并且不应阻塞。这还是可以有很好的利用性的。

关于java - 异步数据库库是如何实现的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38943057/

相关文章:

java - 无法设置 @Async 方法

java - for 循环中的异步回调

java - 如何获取两个日期之间的数据 REST Spring

java - 返回不可变列表

multithreading - 用lua制作一个线程系统

java - AtomicInteger 是为多线程应用程序提供计数器的好解决方案吗?

c - 自旋锁实现 (OSSpinLock)

java - 方法在调用时似乎没有运行

java - 如何确定构造函数的参数

c++ - Boost.asio 和异步链,unique_ptr?