gpt4 book ai didi

scala - 包含在 Scala Future 中的 JDBC 调用

转载 作者:行者123 更新时间:2023-12-04 19:26:08 24 4
gpt4 key购买 nike

我正在编写一个 Akka HTTP Web API,它使用 OJDBC 连接到一个 Oracle 数据库实例。
据我所知,没有用于连接数据库的异步 JDBC API,也没有回调实现,因此,必须阻塞进程线程才能完成调用。
我的问题是:让 Akka HTTP 自然地允许使用 Scala Future 处理请求,将数据库调用简单地包装到 Scala Future 中是个好主意吗?底层线程在等待数据库响应时是否空闲?

最佳答案

底层线程在等待数据库响应时是否空闲?
是的,线程被阻塞,直到 JDBC 调用完成。这不是什么好事,但直到adba准备好可能没有更好的选择。

使用 Future 来阻塞 IO(如 JDBC 调用)是一种常见的模式。不过有一些事情需要考虑。在 github 上有一篇关于该主题的精彩文章。 .

总结文章中描述的一些要点:

  • 将您的阻塞调用包裹在 blocking 内块,像这样:
    def fetchUser(id: Long): Future[User]  = Future {
    blocking { //mark this operation as blocking
    ...
    preparedStatement.execute()
    ...
    }
    }
  • 你不应该使用 scala.concurrent.ExecutionContext.Implicits.global对于做任何阻塞的 future ,因为你可能会饿死线程池。您应该为阻塞操作创建一个单独的线程池:
    object BlockingIOExecutionContext {
    implicit val ec: ExecutionContextExecutor = ExecutionContext.fromExecutor(
    Executors.newCachedThreadPool()
    ) // create seperate thread pool for our blocking operations
    }

  • 对你来说最好的选择就是使用某种成熟的 Scala 框架,为你做这些事情,比如 slickdoobie .

    关于scala - 包含在 Scala Future 中的 JDBC 调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56092605/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com