Web应用中长时间运行查询问题的解决方案(异步请求)

2023-11-25

这是问题所在

企业 Web 应用程序的用户正在执行导致长(非常长)数据库查询(或其他长处理密集型任务)的任务

问题:

  • 请求超时 - 一段时间后用户可能会遇到请求超时
  • 会话超时 - 如果未使用会话保持方法,则可能会发生会话超时
  • Request thread lock
    • 由于请求线程没有返回,它可能会阻止新的请求(如果达到池限制)
    • 在某些应用程序服务器中,服务器的健康状态可能会触发节点或应用程序的强制重启(由于长时间运行的请求线程)
  • If the user leaves the page:
    • 交易没有被取消 - 导致无用的处理,没有人会从中受益
    • 用户完成后无法返回查看结果
  • 无进度指示 - 用户只需等待页面刷新

我想出了几种解决方案,但我不确定哪个更好(在各个方面,性能,最佳实践,优雅和可维护性),我想知道您推荐的解决方案是什么,以及是否有我错过了一个解决方案? (可能是的,而且很多)

糟糕的解决方案:使用请求线程作为工作线程,在会话中保存进度状态,让 AJAX 调用检查另一个并行请求中的状态(在会话中)

妥协的解决方案:创建您自己的线程池,处理监视线程、工作线程,并通过同步分布式事务缓存或持久存储中的状态来处理集群。这会释放请求,但会创建应用程序服务器不知道的线程,并且不会在取消部署时关闭。由您以干净的方式关闭线程,并且您总是有可能最终泄漏一些东西。这也不是 J2EE 的方法。

J2EE 解决方案:使用 JMS 进行异步任务,这就是它的用途

弹簧解决方案:使用 Spring 批处理

你会在你的项目中做什么/做了什么?您还知道哪些其他解决方案?您认为我上面提到的哪一个是获胜者?


我会结合你所谓的“糟糕的解决方案”和“j2ee解决方案”:

  1. 原始 UI 线程向“后端”发送异步 JMS 消息并返回。
  2. 后端接收异步请求并处理。
  3. 当后端到达结果(或错误)时,它会返回到控制器层。
  4. UI 仍然执行 AJAX 轮询或使用 Bayeux/Cometed,接收并显示结果。

技巧是匹配请求/响应对。我会这样做:

  1. 创建一个具有 SESSION 甚至 APPLICATION 范围的“AsyncManagerService”(AMS),以便所有线程都与同一个实例通信。
  2. AMS 持有一个以 id 作为键、以任意对象作为值的映射。
  3. 创建请求 JMS 消息时,生成一个唯一的随机密钥并将其放入消息的 jmsCorrelationId 以及映射中,其中NULL作为一个值。还要将该 id 传递给 UI。
  4. 让UI线程用之前生成的id轮询AMS只要地图中的值是NULL.
  5. 当结果准备好后,让您的 JMS 接收器将其放入 AMS 映射的给定 id 中。
  6. 下次 UI 线程轮询地图时,它将收到答案并停止轮询。

这是干净的,并且从任何具体领域中很好地抽象出来。纯粹的技术解决方案。

即使您不喜欢轮询,HTTP 在设计上也是无状态的,我认为这种方式轮询仅在明确定义的时间间隔内发生。

不管怎样,我用这个模式实现了一个系统,它运行得很好......

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

Web应用中长时间运行查询问题的解决方案(异步请求) 的相关文章

  • Tomcat 与 Weblogic JNDI 查找

    我们使用的 Weblogic 服务器已配置为允许 JNDI 数据源名称 例如 appds 对于开发 本地主机 我们可能会运行 Tomcat 并且在 server xml 的 部分中声明时 Tomcat 会将 JNDI 数据源挂在 JNDI
  • 用于商业 Web 应用程序的 Flash - 为什么不呢?

    我从事开发商业网络应用程序的行业 它们大多供内部使用 有时有合作伙伴区域 但很少可供公共互联网使用 它们是帮助公司运营业务的应用程序 一段时间以来 我有一个想法困扰着我 为什么不使用 Flash 到现在为止都是ASP NET AJAX 这还
  • 内容安全策略:页面设置阻止自行加载资源?

    我有基于 Java 的 Web 应用程序运行在Tomcat http en wikipedia org wiki Apache Tomcat6 我的应用程序在本地主机和端口 9001 上运行 为了使我的应用程序更加安全并降低风险XSS ht
  • 如何在 J2EE 中进行动态 URL 重写

    回到我的 ASP NET 时代 我使用URL重写器 NET http urlrewriter net 进行动态 URL 重写 基本上 它是一个 HTTPModule 可以拦截页面请求并根据您定义的规则重写 URL 与 MOD REWRITE
  • java 目录权限与 AccessController.checkPermission

    我试图通过 checkPermission 方法获取目录权限 如代码中所示 private static boolean dirPermissions String dir String perm try AccessController
  • 哪些浏览器支持 HTML5 WebSocket API?

    这个问题的答案是社区努力 help privileges edit community wiki 编辑现有答案以改进这篇文章 目前不接受新的答案或互动 我将开发一个在浏览器中运行的即时消息应用程序 哪些浏览器支持WebSocket API
  • 使用 Jboss7 加载资源返回 null

    如何使用Jboss7 1从java代码中加载图像等资源 这曾经与 Jboss4 一起使用 this getClass getClassLoader getResourceAsStream myapp includes images imag
  • 我应该使用 @NamedQuery 注释还是 addNamedQuery 方法?

    目前 组成我的应用程序的 JPA 实体有一个 NamedQueries 块 其中包含许多 NamedQuery 注释 这很有效 但我的一些实体有超过 80 个 NamedQuery 注释 并且变得难以维护 我现在需要向查询添加排序 并且不想
  • 如何在 Compojure 中使用 lib-noir 有状态会话

    我想我这里有一个相当简单的问题 但我已经看这个屏幕太久了 所以我正在尝试 但失败了 让有状态会话在 Compojure 中工作 refheap代码粘贴is here https www refheap com paste 11161 你可以
  • 升级到 Netbeans 8.0.1 和 Glassfish 4,1 后包不存在

    我正在学习 JavaEE CDI 并使用 NetBeans 8 0 Glassfish 4 创建了一个小型应用程序 升级到 NetBeans 8 0 1 和 Glassfish 4 1 后 我收到很多错误报告 指出某些包不存在 例如 我无法
  • 仅使用 ServletContext 查找应用程序的 URL

    我正在使用 Spring MVC 编写一个 Java Web 应用程序 我有一个后台进程 它会遍历数据库并查找必须通过电子邮件发送给我的用户的通知 这些电子邮件需要包含应用程序的超链接 对于网络应用程序来说 这似乎是相当常见的模式 但我遇到
  • 如何在 Eclipse 中使用 Hibernate Tools 生成 DAO?

    我在用着 Eclipse Java EE IDE Web 开发人员 版本 Indigo 发布 使用 hibernate 工具 我对 Eclipse 中的 hibernate 很陌生 所以我学习如何配置 hibernate 并使用注释生成 P
  • 什么时候在 Spring MVC 之上使用 Spring WebFlow 才有意义?

    Spring MVC 已成为构建企业 Web 应用程序的非常流行的框架 任何复杂的 Web 应用程序都有某些需要编码的流程 包括一些条件流程 即 如果信用卡信息正确 则显示已处理的订单 如果输入不正确 则显示验证错误 什么时候在 Sprin
  • JSF a4j:设置“禁用”时命令按钮不起作用

    当我在 a4j commandButton 上包含 disabled 属性时 不会执行该按钮的操作 去掉 禁用 属性会使其正常工作 我没有进行任何特殊的验证 据我所知 也没有看到任何验证错误消息 这是我的页面的一部分
  • 什么时候应该构建 Web 应用程序而不是胖客户端?

    我想听听其他人关于何时应该构建 Web 应用程序而不是构建胖客户端的建议 在过去的几年中 我参与了多次关于是否应该使用 Web 浏览器界面构建应用程序 或升级旧应用程序 的讨论 通常这些是组织内使用的内部系统 而不是大众市场的收缩包装产品
  • 如何更改部署在tomcat中的Web应用程序浏览器标题栏中显示的徽标?

    我在 tomcat 中部署了一个 Web 应用程序 当我在浏览器中打开应用程序时 地址栏中 URL 之前的图像和选项卡上应用程序标题之前的图像都显示 tomcat 图像 我想改变这一点并在这两个地方放入我自己的徽标 我怎样才能做到这一点 这
  • 缓存清单大小限制和 Web 应用程序

    我正处于编写应用程序的规划阶段 仍在选择我希望用来编写应用程序的技术 最初的想法是编写一个网络应用程序 但这有 有 无法离线查看的缺点 然后我发现了缓存清单 这似乎是一个答案 然而 从第一点开始 缓存清单似乎有大小限制 我找不到每个浏览器的
  • 何时使用 doGet、doPost 和 service [重复]

    这个问题在这里已经有答案了 我想知道这些 servlet 方法 我对这些方法有所了解 比如 doPost对参数数量没有限制 同时doGet has doGet比doPost doPost安全于doGet 我的问题是 因为这些方法采用相同的参
  • 卸载后 Web 应用程序不显示“添加到主屏幕”

    这是我第一次创建网络应用程序 我设法解决了这个问题 所以我得到了实际的 chrome 提示 将其添加到主屏幕 然后我从手机上卸载了该网络应用程序 因为我想将其展示给我的同事 但是 屏幕上不再出现提示 问题 这是有意为之的行为还是我的应用程序
  • 如何将 Eclipse Classic 升级到 Java EE?

    我想开发 HTML5 网站 我已经安装了用于Android开发的Java 我的机器上安装了 Eclipse Classic 3 6 现在我希望在同一台机器上安装 Java EE 是否可以 如果是这样 请告诉我如何将 Eclipse Clas

随机推荐

  • Visual Studio 调试器未附加到 Unity

    我在将 Visual Studio 的调试器附加到 Unity 时遇到问题 在 VS 内编辑和编译脚本工作正常 但是 当单击 附加到 Unity 或 附加到 Unity 并播放 时 代码会编译 但不会发生任何其他情况 如果所有版本都是最新的
  • 如何对 SQL 中存储的附近纬度和经度位置进行分组

    我正在尝试分析英国自行车事故的数据 以找到统计黑点 这是另一个网站的数据示例 http www cycleinjury co uk map 我目前正在使用 SQLite 来存储大约 100k 的纬度 经度位置 我想将附近的位置分组在一起 这
  • .net 3.5 中的 string.Join()

    我在 vs2008 中有一个 net 3 5 项目 我正在尝试使用这种超载 of string Join 需要一个string and IEnumerable
  • .NET Core 3.1 Worker Service - 环境特定配置

    我正在尝试使用 VS 2019 Enterprise 提供的 asp net core 3 1 模板设置工作人员服务 迄今为止 1 创建一个新项目并运行它 托管环境 开发 按预期工作 发展 2 创建了FileSystem发布配置文件 并添加
  • 当名称不包含某些单词时删除文件

    我正在使用 Linux 并打算使用 shell 删除一些文件 我的文件夹中有一些文件 一些文件名包含 好 一词 另一些则不包含 例如 ssgood wmv ssbad wmv goodboy wmv cuteboy wmv 我想删除名称中不
  • 我们如何以编程方式获取 UIImageView 的坐标?

    我想以编程方式获取 UIImageView 的坐标 我该怎么做呢 例如我有一个正方形 我想获得所有角点的坐标 我必须如何进行 NSLog f ImageView frame origin x NSLog f ImageView frame
  • 保存并检索选定的微调器位置

    您将如何保存和检索微调器选择 以便当您返回时会选择微调器上的相同项目 也许有共同的偏好 将数据保存在sharedPreferences 将此代码放在onItemSelected 方法并保存所选值的位置spinner int userChoi
  • 清单中的 Visual Studio 2005 安全更新和 CRT DLL 版本

    最近的 Visual Studio 2005 安全更新可能会给我们带来问题 我们构建并内部分发用 C 编写的 SDK 这些 SDK 仅是头文件和静态库的集合 安装安全更新后 我们的 SDK 现在依赖于较新版本的 MSVC CRT DLL 这
  • Oracle XE 停止工作。 TNS 侦听器拒绝连接

    我正在开发一个使用 Oracle XE 11g 作为其 RDBMS 的应用程序 它工作了几个星期 但现在我开始收到有关连接被拒绝的错误消息 我重新启动了系统 但没有帮助 我卸载了 XE 删除了所有剩余文件 甚至从注册表中 并重新安装了它 现
  • 流模式下的 AudioTrack MODE_STREAMING

    我需要流式传输运行时生成的 PCM 数据 所以我有一个带循环的线程 public void run while mAudioTrack write getPCM 不幸的是这不起作用 它似乎不依赖于 AudioTrack 缓冲区大小 我希望它
  • 子控制器未注入主控制器

    我有一个 BorderPane 与 MainController 关联 BorderPane 使用的 FXML
  • Android 上最低开销的相机到 CPU 到 GPU 的方法

    我的应用程序需要在 CPU 上对实时相机帧进行一些处理 然后再将它们渲染到 GPU 上 GPU 上还渲染了一些其他内容 这些内容取决于 CPU 处理的结果 因此 保持所有内容同步非常重要 这样我们就不会在 GPU 上渲染帧本身 直到 CPU
  • iOS 7 中的静默推送通知有速率限制吗?

    我看到一个关于静默推送通知限制的参考 静默推送受到速率限制 每小时少量 来自 WWDC 2013 http devstreaming apple com videos wwdc 2013 204xex2xvpdncz9kdb17lmfooh
  • 是否可以使用一个替换函数来替换一个字段中的多个字符串?

    在我的报告中 我需要使用内置替换函数将 a 替换为 b 将 c 替换为 d 当我只使用两个这样的函数时 替换 字段 field1 Value a b 替换 字段 field1 Value c d 我在报告中两次从现场获得文本 是否有可能做到
  • 使用 Google+ 登录时如何注销

    谷歌文档在那里gapi auth signOut 方法在这里 https developers google com web signin sign out 问题是它说你只能在之后调用该方法signinCallback已解雇 据我所知 唯一
  • 不同库中的相同符号和链接顺序

    我有 2 个库 test 1 and test 2 两个库都包含一个全局的外部 C void f 函数 具有不同的实现 只是cout用于测试 我做了以下测试 Test 1动态链接 如果我添加libtest 1 so进而libtest 2 s
  • 无法在 case 语句 bash 中设置变量

    我试图根据一堆输入条件设置一个变量 这是代码的一个小示例 bin bash INSTANCE SIZE case 1 in micro INSTANCE SIZE t1 micro small INSTANCE SIZE m1 small
  • 自动释放与释放

    当我需要一个数组临时使用时 这些有什么区别 1 NSMutableArray stuff NSMutableArray alloc init use the array stuff release 2 NSMutableArray stuf
  • 在 WooCommerce 购物车中获取购物车项目的产品 ID

    cart item woocommerce gt cart gt get cart 我有上面的代码 如果我在 cart item 上运行 print r 我会得到一个多维数组 Array a6292668b36ef412fa3c4102d1
  • Web应用中长时间运行查询问题的解决方案(异步请求)

    这是问题所在 企业 Web 应用程序的用户正在执行导致长 非常长 数据库查询 或其他长处理密集型任务 的任务 问题 请求超时 一段时间后用户可能会遇到请求超时 会话超时 如果未使用会话保持方法 则可能会发生会话超时 Request thre