我正在编写一个,它使用OJDBC连接到Oracle数据库实例。
据我所知,没有异步JDBC API连接到数据库,也没有回调实现,因此必须阻塞进程线程才能完成调用。
我的问题是:拥有Akka HTTP自然允许用Scala处理请求,简单地将数据库调用包装到Scala中是个好主意吗?在等待数据库响应时,底层线程是否处于空闲状态?
发布于 2019-05-11 17:36:24
在等待数据库响应时,底层线程是否处于空闲状态?是的,线程被阻塞,直到JDBC调用结束。这不是件好事,但在阿德巴准备好之前,可能没有更好的选择了。
使用Future来阻止IO (如JDBC调用)是一种常见的模式。不过,有一些事情需要考虑。在github上有一篇很好的关于这个主题的文章。
总结文章中所描述的一些要点:
blocking块中,如下所示:
fetchUser(id: Long):FutureUser =未来{阻塞{//将此操作标记为阻塞.preparedStatement.execute() }scala.concurrent.ExecutionContext.Implicits.global,因为您可能会饥饿线程池。您应该为阻塞操作创建一个单独的线程池:
对象BlockingIOExecutionContext {隐式val ec: ExecutionContextExecutor = ExecutionContext.fromExecutor( Executors.newCachedThreadPool() ) //为我们的阻塞操作创建分离线程池}https://stackoverflow.com/questions/56092605
复制相似问题