当前位置: 首页 > 面试题库 >

可以异步调用jdbc吗?

夹谷承安
2023-03-14
问题内容

我想知道是否有一种方法可以对数据库进行异步调用吗?

例如,假设我有一个很大的请求,需要很长时间来处理,我想发送请求并在请求将返回值时(通过传递侦听器/回调等)接收通知。我不想阻塞等待数据库答复。

我不认为使用线程池是一种解决方案,因为它无法扩展,在大量并发请求的情况下,这会产生大量线程。

我们正在面对网络服务器的此类问题,并且我们已经找到解决方案,方法是使用select / poll /
epoll系统调用来避免每个连接只有一个线程。我只是想知道如何在数据库请求中具有类似的功能?

注意:我知道使用FixedThreadPool可能是一个很好的解决方法,但是令我惊讶的是,没有人开发出真正异步的系统(无需使用额外的线程)。

更新
由于缺乏实际可行的解决方案,我决定自己创建一个库(finagle的一部分):finagle-
mysql。它基本上解码/解码mysql请求/响应,并在后台使用Finagle / Netty。即使有大量连接,它的扩展性也非常好。


问题答案:

我不明白在Actor,executor或其他任何东西中包装JDBC调用的提议方法如何能在这里提供帮助-有人可以澄清一下。

当然,基本问题是JDBC操作在套接字IO上阻塞。执行此操作时,它将阻止线程在故事结尾运行。无论选择哪种包装框架,使用它最终都会导致每个并发请求保持一个线程繁忙/阻塞。

如果基础数据库驱动程序(MySql?)提供了一种方法来拦截套接字的创建(请参见SocketFactory),那么我想可以在JDBC
api之上构建异步事件驱动的数据库层,但是我们必须封装整个JDBC在事件驱动的外观后面,并且该外观看起来不像JDBC(在事件驱动之后)。数据库处理将在与调用方不同的线程上异步发生,并且您必须弄清楚如何构建不依赖线程亲和力的事务管理器。

就像我提到的方法一样,它甚至允许单个后台线程处理并发JDBC执行程序的负载。实际上,您可能会运行一个线程池来利用多个内核。

(当然,我不是在评论原始问题的逻辑,只是回答那些暗示在没有选择器模式的情况下,在阻塞套接字IO的情况下并发是可能的-
简单地算出典型的JDBC并发并放入在大小合适的连接池中)。

看起来MySql可能按照我的建议做了一些事情— http://code.google.com/p/async-mysql-
connector/wiki/UsageExample



 类似资料:
  • 问题内容: 在过去的几个小时中,我一直在努力解决这个问题,但无法解决。我想我仍然必须习惯于函数式编程风格;) 我写了一个递归函数,它遍历目录结构并对某些文件进行处理。此功能使用异步IO方法。现在,我要在完成整个遍历后执行一些操作。 如何确保在执行完所有调用但仍使用异步IO功能后执行此操作? 问题答案: 查找“ 步骤”模块。它可以链接异步函数调用,并将结果从一个传递到另一个。

  • 是否可以调用一个异步方法,以便它从一个同步的方法异步运行?我不关心它挂起同步调用程序直到它返回,而是希望该方法被异步调用。

  • 本文向大家介绍JavaScript 异步调用,包括了JavaScript 异步调用的使用技巧和注意事项,需要的朋友参考一下 问题 可修改下面的 aa() 函数,目的是在一抄后用 console.log() 输出 want-value 但是,有额外要求: aa() 函数可以随意修改,但是不能有 console.log() 执行 console.log() 语句里不能有 setTimeout 包裹 解

  • Provider端异步执行将阻塞的业务从Dubbo内部线程池切换到业务自定义线程,避免Dubbo线程池的过度占用,有助于避免不同服务间的互相影响。异步执行无益于节省资源或提升RPC响应性能,因为如果业务执行需要阻塞,则始终还是要有线程来负责执行。 注意:Provider端异步执行和Consumer端异步调用是相互独立的,你可以任意正交组合两端配置 Consumer同步 - Provider同步 C

  • 从v2.7.0开始,Dubbo的所有异步编程接口开始以CompletableFuture为基础 基于 NIO 的非阻塞实现并行调用,客户端不需要启动多线程即可完成并行调用多个远程服务,相对多线程开销较小。 使用CompletableFuture签名的接口 需要服务提供者事先定义CompletableFuture签名的服务,具体参见服务端异步执行接口定义: public interface Asyn

  • 同步调用异步方法最安全的方法是什么?