JDBC 调用包含在 Scala Future 中
JDBC calls wrapped in Scala Future
我正在编写一个 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
用于执行任何阻塞的 futures,因为您可能会耗尽线程池。您应该为阻塞操作创建一个单独的线程池:
object BlockingIOExecutionContext {
implicit val ec: ExecutionContextExecutor = ExecutionContext.fromExecutor(
Executors.newCachedThreadPool()
) // create seperate thread pool for our blocking operations
}
我正在编写一个 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
用于执行任何阻塞的 futures,因为您可能会耗尽线程池。您应该为阻塞操作创建一个单独的线程池:object BlockingIOExecutionContext { implicit val ec: ExecutionContextExecutor = ExecutionContext.fromExecutor( Executors.newCachedThreadPool() ) // create seperate thread pool for our blocking operations }