了解非阻塞 Web 服务调用与非阻塞 JDBC 之间的区别

2024-01-06

我试图从概念上理解为什么在 Play Framework 2.0 中,调用被认为是最佳实践WS.url().get()对于 Web 服务调用,但是如果您将任何其他阻塞调用(例如 JDBC 调用)包装在 Promise 中,是否建议您在默认执行上下文以外的执行上下文中执行此操作?

据我所知,默认情况下,Play Framework 的线程池配置为每个核心有一个线程,并且每个控制器都希望运行完全非阻塞的代码。因此,如果您在控制器中进行阻塞调用(例如,对 Web 服务),那么您需要确保此调用不会占用控制器可用的线程。

否则,将没有线程可以执行控制器,因为它们都在阻塞状态下等待。

但令我困惑的是以下几点:

  • 首先,控制器代码本身在哪个线程池中执行?这是默认的执行上下文吗?
  • 其次,一方面我理解WS.url().get()也在默认执行上下文中执行,但另一方面,Play框架文档关于线程池配置 https://playframework.com/documentation/2.3.x/ThreadPools指出“请注意,您可能会想……将阻塞代码包装在 Futures 中。这并不意味着它是非阻塞的,它只是意味着阻塞将发生在不同的线程中。”

上面的意思是不是WS.url().get()是在同一个默认执行上下文中“只是发生在不同的线程中”吗?在不同的执行上下文中执行 JDBC 调用有什么不同?


1) Play 控制器函数在 Play 的默认线程池中执行,如链接文档中所述:

Play 默认线程池 - 这是执行 Play Framework 中所有应用程序代码的默认线程池。它是一个 Akka 调度程序,可以通过配置 Akka 进行配置,如下所述。默认情况下,每个处理器有一个线程。

因此,您需要非常小心地处理控制器函数内的阻塞,因为这会阻塞默认线程池中的线程。

2) Play Web 服务是非阻塞 API,因此does not阻止它的ExecutionContext。因此,你can在控制器函数中进行多次 WS 调用,而不会阻塞默认线程池。 WS 调用和 JDBC 调用之间的主要区别在于,WS 调用在等待远程服务器响应时不会阻塞线程,调用是异步进行的。 JDBC 调用(像大多数 java IO 一样)将在等待响应时阻塞其线程。

在不同的环境中执行 JDBC 调用ExecutionContext将释放默认值ExecutionContext做其他工作,从而允许您的服务器处理更多请求。你可以让 Akka 为你处理上下文切换的繁重工作。虽然 JDBC 调用仍然阻塞线程,但它们至少不会阻塞处理请求的线程。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

了解非阻塞 Web 服务调用与非阻塞 JDBC 之间的区别 的相关文章

  • Selector.close() 是否关闭所有客户端套接字?

    我是 nio 套接字的新手 我已经使用 nio 套接字编写了一个服务器 现在我正在尝试编写关闭钩子以确保通过清理资源正常退出 我的问题是Selector close 方法关闭所有客户端套接字 如果没有 请告诉我如何访问所有客户端套接字 而无
  • Java:为什么.class文件中的方法类型包含返回类型,而不仅仅是签名?

    class 文件的常量池中有一个 NameAndType 结构 它用于动态绑定 该类可以 导出 的所有方法都被描述为 签名 返回类型 喜欢 getVector Ljava util Vector 当某些 jar 中方法的返回类型发生更改时
  • 二元运算符 >=、-、* 的错误操作数类型

    我无法弄清楚如何修复代码中不断出现的这些错误 import java util Scanner public class Unit02Prog1 public static void main String args Scanner inp
  • Spring Data Jpa OneToMany 同时保存子实体和父实体?

    这是我的父实体 注意 为了简洁起见 删除了 getter setter lombok 注释 Entity public class Board Id GeneratedValue strategy GenerationType IDENTI
  • Jenkins 未显示 Maven 编译器错误

    在 Jenkins 中构建多模块 maven 3 项目时 如果出现构建错误 我们会收到一条神秘消息 表明 Maven 编译器插件失败 这在上周才刚刚开始发生 INFO BUILD FAILURE INFO INFO Total time 1
  • 清空变量不会使方法引用无效[重复]

    这个问题在这里已经有答案了 为什么代码不抛出NullPointerException当我使用与变量绑定的方法引用时dog我后来分配了null to 我正在使用 Java 8 import java util function Functio
  • 当我们使用赋值而不是比较时,如何评估 if/while 条件?

    我在学习 Java 的 OCA OCP 时发现了这个令人惊讶的事情 下面是第一段代码 其中 if 测试条件 部分 让我惊讶 public class BooleanIf public static void main String args
  • 如何在正则表达式中编写可选单词?

    我想编写一个识别以下模式的 java 正则表达式 abc def the ghi and abc def ghi 我试过这个 abc def the ghi 但是 它没有识别第二种模式 我哪里出错了 abc def the ghi 删除多余
  • 使用正则表达式验证电子邮件的最大长度

    我找到了用于电子邮件验证的正则表达式 a z0 9 a z0 9 a z0 9 a z0 9 a z 2 4 我希望电子邮件的最大长度为 20 个字符 因此我将其更改为 a z0 9 a z0 9 a z0 9 a z0 9 a z 2 4
  • 在 doxygen 中使用 @see 或 @link

    我之前用 Javadoc 记录并使用了标签 see link or see foo and link foo 在我的描述中链接到其他课程 现在我尝试了doxygen 似乎这些标签不兼容 如果我运行 doxygen 完整的标签将被简单地解释为
  • 生成一定长度的所有排列

    假设我们有一个字母表 abcdefghiklimnop 如何以有效的方式以五个一组的形式重复该字母表来递归生成排列 几天来我一直在为此苦苦挣扎 任何反馈都会有帮助 本质上这与 生成给定字符串的所有排列 https stackoverflow
  • 扩展多个类

    我知道 Java 不支持多重继承 因为不允许扩展多个类 我只是想知道我的问题是否有解决方法 我有一个名为CustomAction需要扩展两个抽象类 BaseAction and QuoteBaseAction 我无法更改这些抽象类中的任何一
  • 更新/编辑数据库中输入的数据 - servlet

    我准备了一个用于插入 查看和删除数据的表单 现在我想添加选项来编辑该数据 但要么我遵循错误的方法 要么我不知道如何做到这一点 那么任何人都可以帮助我继续编辑输入的数据吗 我应该参考旧的 html 页面进行编辑还是新页面或 我知道我没有遵循
  • Java 8:如何创建毫秒、微秒或纳秒的 DateTimeFormatter?

    我需要创建格式化程序来解析具有可选的毫秒 微米或纳秒分数的时间戳 例如 对于我的需求 我看到以下机会 DateTimeFormatter formatter new DateTimeFormatterBuilder append DateT
  • 如何在一次操作中使用 Thymeleaf 检查 null 和空条件?

    有什么方法可以检查 Thymeleaf 中的 null 和empty 条件吗 方法一 1 variable1 variable2 variable3 2 variable null 3 variable 如果我们结合两个条件 例如 vari
  • log4j.properties 在 Wildfly 上无法正常工作

    我的类路径中有一个 log4j properties 文件 它位于 APP XX jar log4j properties 位置 我注意到在ear文件中我还可以在lib文件夹中找到log4j 1 2 17 jar 但无论我在 log4j p
  • 为什么/何时应该使用泛型方法?

    学习Java的时候遇到过通用方法 public
  • 假布尔值=真?

    我在一本书中找到了这段代码 并在 Netbeans 中执行了它 boolean b false if b true System out println true else System out println false 我只是不明白为什
  • JPA ManyToMany 产生的空联接表

    我有一个应用程序 其中我尝试使用 Hibernate 作为 JPA 提供程序来实现两个实体之间的多对多关系 我正在尝试的例子是一个单向的 其中一个相机可以有多个镜头 而镜头可以安装到多个相机中 以下是我的实体类 只需粘贴其中的相关部分 Ca
  • MyBatis 枚举的使用

    我知道以前有人问过这个问题 但我无法根据迄今为止找到的信息实施解决方案 所以也许有人可以向我解释一下 我有一个表 状态 它有两列 id 和 name id是PK 我不想使用 POJO Status 而是使用枚举 我创建了这样一个枚举 如下所

随机推荐

  • 以某种方式将自定义 .colorNames 添加到 UIColor 中?

    我非常喜欢像这样使用颜色的快捷方式 myLabel fontColor gray 并制作我自己的 像这样 static let fadedGreen SKColor init hue 0 33 saturation 1 brightness
  • PrimeNG p-table:重置表过滤器时如何清除 p-下拉过滤器值?

    我正在使用 PrimeNGp table标题行同时具有input and p dropdown过滤器并需要清除过滤器值input and p dropdown当呼叫 reset 方法在桌子上 正如其他人指出的那样 https stackov
  • 表达式“j = ++(i | i); 和 j = ++(i & i); 应该是左值错误?

    我期待在我的以下代码中 include
  • Flutter:如何在运行时更改主题亮度?

    我有一个MaterialApp with a ThemeData最初设置为Brightness light 我想将亮度切换为Brightness dark在运行时 但是当我进行更改时 只有状态栏发生变化 没有一个 Flutter 小部件实际
  • 当状态更改时,如何防止命名视图重新加载? AngularJS UI 路由器

    我正在使用优秀的ui router我的应用程序中的模块 作为其中的一部分 我使用命名视图来管理应用程序中的 动态子导航 考虑以下 urlRouterProvider otherwise person list stateProvider s
  • Android-在列表视图点击上打开新活动

    我试图做到这一点 以便当我单击列表视图中的特定项目时 它会将我带到特定的屏幕 有谁知道如何做到这一点 我为此使用下面的代码 此外 我试图让一个后退按钮出现在列表视图的底部 到目前为止 我只能让它出现在列表视图中的每个条目上 我们将不胜感激
  • 如何将任意方法(或委托)作为参数传递给函数?

    我需要能够将任意方法传递给某个函数myFunction void myFunction AnyFunc func 应该可以使用其他静态 实例 公共或私有方法甚至委托来执行它 myFunction SomeClass PublicStatic
  • Auth 弹出返回空白页

    当我向谷歌提交身份验证调用时 我从谷歌窗口中收到弹出窗口 然后当我提交我的凭据并按 提交 时 它会转发到类似的内容 https auth firebase com v2 FIREBASEREF auth google callback st
  • 在 Azure Active Directory 中删除应用程序的 AppRole

    从应用程序清单中删除 AppRole 会产生 400 Bad Request 并显示以下错误 除非先禁用属性值 否则无法删除该属性值 当我将 isEnabled 属性设置为 false 然后单击 保存 时 我会成功保存并显示 200 OK
  • Bootstrap 可切换选项卡 - 删除轮廓/焦点?

    我正在使用可切换选项卡Twitter 的 Bootstrap http twitter github com bootstrap javascript html tabs 我遇到的问题 即使你也可以从例子中看到 当用户单击选项卡时 活动选项
  • 当出于样式目的而隐藏时,IE 无法发送文件上传

    好吧 我很困惑 所以我要提出另一个有关文件文件上传表单元素样式的问题 经过一番尝试后 我终于 认为 它可以工作了 但像往常一样 IE 将再次开始抗议 问题是 我将拥有以下形式 它用 css 隐藏真实的文件输入 因此它使用 fileHidde
  • 如何在列表中查找多个最大值项目[重复]

    这个问题在这里已经有答案了 我试图弄清楚如何获取整数列表并将该列表中的所有项目返回到另一个列表中作为它们的最大值 但带有它们的索引 因此 我需要能够在不使用枚举 lambda numpy 或任何此类内容的情况下完成此操作 它必须是非常基本的
  • 列表中的元素测试

    对于我正在编写的样式表 实际上是一组样式表 每个样式表生成不同的输出格式 我需要评估某个值是否存在于值列表中 在这种情况下 正在测试的值取自元素的属性 要测试的列表来自样式表的调用 并被视为顶级
  • C 中的对齐属性 [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我在 SO 中看到了很多关于对齐属性
  • SASS 和@font-face

    我有以下 CSS 我如何在 SASS 中描述它 我尝试用 css2sass 反向编译它 但不断收到错误 这是我的 CSS 可以工作 吗 font face font family bingo src url bingo eot src lo
  • React:“重定向”未从“react-router-dom”导出

    我在运行时收到以下错误npm run start在终端中 尝试导入错误 重定向 未从 react router dom 导出 我已经重新安装了node modules react router dom react router 还重新启动了
  • 什么是 CUDA 上下文?

    谁能解释一下或者给我推荐一些关于什么是 CUDA 上下文的好资料 我搜索了 CUDA 开发者指南 但对它并不满意 任何解释或帮助都会很棒 cuda API 公开了有状态库的功能 两个连续的调用彼此相关 简而言之 上下文就是它的状态 The
  • iOS:如何将 MKMapPoint 或 CLLocationCooperative2D 转换为 UTM?

    根据我的阅读 这需要一些我不擅长的复杂数学 所以 我在这里问 有人有将 MKMapPoint 或 CLLocationCooperative2D 转换为 UTM 值的经验吗 我找到了这个资源 http www uwgb edu dutchs
  • 什么是 csv 文件以及如何使用 java 代码解析它? [复制]

    这个问题在这里已经有答案了 可能的重复 快速 CSV 解析 https stackoverflow com questions 6857248 fast csv parsing 如何正确地将 CSV 文件解析为二维数组 https stac
  • 了解非阻塞 Web 服务调用与非阻塞 JDBC 之间的区别

    我试图从概念上理解为什么在 Play Framework 2 0 中 调用被认为是最佳实践WS url get 对于 Web 服务调用 但是如果您将任何其他阻塞调用 例如 JDBC 调用 包装在 Promise 中 是否建议您在默认执行上下