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应用中长时间运行查询问题的解决方案(异步请求) 的相关文章

  • (AD) ldap 领域中的组成员资格

    我在 java ee 企业应用程序中使用 JAAS 框架进行身份验证和授权过程 我使用 GlassFish 作为应用程序服务器 我的领域配置如下所示
  • 寻找网站测试自动化的方法

    我们开发定制调查网站 我正在寻找一种方法来自动化这些网站的模式测试 调查通常包含许多复杂的规则和分支 这些规则和分支也会根据项目的响应方式而触发 所有调查在发布给客户之前都经过严格测试 此测试需要大量的手动工作 我想了解一些可以通过回答问题
  • org.apache.derby.jdbc.ClientDriver 在哪里?

    我下载了jar包核心 Apache Derby 数据库引擎 还包括嵌入式 JDBC 驱动程序 10 9 1 0 http mvnrepository com artifact org apache derby derby 但那个罐子不包括
  • 如何拦截 REST 端点以接收所有标头?

    我当前的代码是 Path login RequestScoped public class LoginResource GET SecurityChecked public Response getUser HeaderParam AUTH
  • 休眠以持久保存日期

    有没有办法告诉 Hibernate java util Date 应该持久保存 我需要这个来解决 MySQL 中缺少的毫秒分辨率问题 您能想到这种方法有什么缺点吗 您可以自己创建字段long 或者使用自定义的UserType 实施后User
  • iOS7 中“-webkit-overflow-scrolling: touch” 最初的屏幕外元素被破坏

    既然转基因种子已经发布了 我们现在可以谈谈了 看起来 iOS7 中的 webkit overflow scrolling touch 已损坏 最初不在屏幕上的元素的触摸事件不会触发 或者在某些情况下只是不可靠 这是一个例子
  • 我可以限制分布式应用程序发出的请求吗?

    我的应用程序发出 Web 服务请求 提供商处理的请求有最大速率 因此我需要限制它们 当应用程序在单个服务器上运行时 我曾经在应用程序级别执行此操作 一个对象跟踪到目前为止已发出的请求数量 并在当前请求超出允许的最大负载时等待 现在 我们正在
  • 使用 google.script.run 从 html 调用库函数

    我使用 Google App Script 实现库 并且使用 google script run 从库中调用函数时遇到一些困难 这是我的图书馆的代码 Code gs function ShowSideBar var html HtmlSer
  • 如何在 Eclipse 中更改动态 Web 项目的上下文根?

    我在 Eclipse 中开发了一个动态 Web 项目 我可以使用以下 URL 通过浏览器访问该应用程序 http localhost 8080 MyDynamicWebApp 我想将访问URL更改为 http localhost 8080
  • 在同一个容器但不同的耳朵中使用本地EJB

    我正在尝试在同一个 Glassfish 但不同的耳朵中使用本地 EJB 但是Glassfish找不到本地EJB或者无法消费 我读到了这个 根据 JavaEE 教程 Local bean 的客户端 必须在与其访问的企业 bean 相同的 JV
  • JSF 错误 - IllegalStateException:PWC3999:提交响应后无法创建会话[重复]

    这个问题在这里已经有答案了 我是 JSF 新手 正在构建一个使用 Facelet 创建的应用程序 这是我的模板master xhtml
  • 如何在 servlet 线程中获取新的有状态会话 bean?

    我正在尝试 EJB3 我想将一个有状态会话 bean 注入到 servlet 中 以便每个访问该 servlet 的用户都会获得一个新的 bean 显然 我不能让 bean 成为 servlet 的实例变量 因为它将被共享 显然不允许注入局
  • “纯”MVC 实现有多大用处?

    我在一家提供类似 CRM 的定制软件的公司工作 我们目前正在重新设计 重新开发该软件 希望它看起来更现代 并且更容易为未来的客户开发和定制 目前 定制每个新应用程序都需要很长时间 有一种假设是 花费这么长时间的原因是 视图 层中存在大量业务
  • 无法获取 ConfigBean 中实体的正确 ID - Java EE

    我正在构建一个药房管理应用程序 每个药房都需要一名管理员 约束是这样的 public class Pharmacy implements Serializable Id GeneratedValue strategy GenerationT
  • JSF 2.x @EJB 依赖注入错误

    因此 正如编程中通常发生的那样 我提出了一个问题 而一个潜在的解决方案又引发了更多问题 和错误 我刚开始使用 servlet JSF 和 EJB 并且遇到了依赖注入错误 这是我原来的问题 JSF h 标签不显示 https stackove
  • JPA Web 应用程序管理策略

    我们目前正在开发一个 J2EE Web 应用程序 使用 JPA 作为我们的数据访问层 我们目前正在研究几种不同的策略来在我们的应用程序中利用缓存 Create an EntityManager per request 在请求范围内获取缓存
  • Cloud Foundry 解释

    所以我一直在阅读 Cloud Foundry 但我仍然对它是什么感到困惑 无论如何 这是我对 CF 上的 PaaS 的看法 希望你们能告诉我我是否错了 并更好地解释一下 Microsoft Azure 或 Google AppEngine
  • Web 应用程序中的 PathLocationStrategy 与 HashLocationStrategy

    使用的优点和缺点是什么 PathLocationStrategy 默认的 HTML 5 PushState 样式 HashLocationStrategy 哈希 URL 样式 例如 使用哈希位置策略将阻止通过 ID 滚动到元素的功能 但某些
  • struts.xml 和 struts-config.xml

    struts xml 和 struts config xml 有什么区别 两者是相同的还是有什么区别 Struts框架的核心配置文件默认是struts xml对于 Struts 2 和struts config xml对于Struts 1
  • 移动端跨浏览器网络测试

    在构建网站时 我通常使用以下工具浏览器截图 http browsershots org确保我的页面在不同的浏览器中看起来相当不错 然而 我开始收到关于在不同便携式设备上运行的大量移动浏览器的抱怨 我的问题很简单 如何最好地进行移动跨浏览器测

随机推荐

  • 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