如何处理数据库中的巨大结果集

2024-06-20

我正在设计一个多层数据库驱动的 Web 应用程序 - SQL 关系数据库、用于中间服务层的 Java、用于 UI 的 Web。语言其实并不重要。

中间服务层执行数据库的实际查询。用户界面只是要求某些数据,并不知道它是由数据库支持的。

问题是如何处理大数据集? UI 请求数据,但结果可能很大,可能太大而无法装入内存。例如,街道标志应用程序可能具有以下服务层:

StreetSign getStreetSign(int identifier)
Collection<StreetSign> getStreetSigns(Street street)
Collection<StreetSign> getStreetSigns(LatLonBox box)

UI 层要求所有街道标志都满足某些标准。根据标准,结果集可能会很大。 UI 层可能会将结果划分为单独的页面(对于浏览器)或仅将它们全部呈现(服务于 Goolge Earth)。潜在的巨大结果集可能是性能和资源问题(内存不足)。

一种解决方案是不返回完全加载的对象(StreetSign 对象)。而是返回某种延迟加载每个单独对象的结果集或迭代器。

另一个解决方案是更改服务 API 以返回所请求数据的子集:

Collection<StreetSign> getStreetSigns(LatLonBox box, int pageNumber, int resultsPerPage)

当然,UI 仍然可以请求巨大的结果集:

getStreetSigns(box, 1, 1000000000)

我很好奇这种场景的标准行业设计模式是什么?


第一个问题应该是:

¿用户需要或有能力管理如此大量的数据吗?

尽管结果集应该进行分页,但如果其潜在大小如此之大,答案将是“可能不会”,因此 UI 不应尝试显示它。

我从事医疗保健系统的 J2EE 项目,该项目处理大量存储的数据,实际上是数百万患者、访问、表单等,一般规则是对于任何用户搜索,建议不要显示超过 100 或 200 行这些标准集产生了更多他可以理解的信息。

实现这一点的方法因项目而异,可以强制 UI 在启动查询之前向服务层询问查询的大小,或者如果结果集增长,则可以从服务层抛出异常太多了(但是这种方式将服务层与有限的 UI 实现结合在一起)。

当心!这并不意味着如果结果大小超过 100,服务层上的每个方法都必须抛出异常,此一般规则仅适用于直接向用户显示的结果集,这是将控件放置在 UI 中的更好理由而不是在服务层。

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

如何处理数据库中的巨大结果集 的相关文章

随机推荐

  • 检测 Angular 项目中的浏览器刷新

    我想使用我的路由器来检测页面何时刷新单页应用程序 https en wikipedia org wiki Single page application 角度项目 还有其他方法吗 In the 组件 ts file import Subsc
  • ESLint 关闭分号规则

    当我搜索关闭分号时 我得到 semi 0或类似的 我尝试将其放入 但我的 linter 仍然在行上添加了分号 下面是我的 eslintrc 我很困惑哪条规则放置了分号 parserOptions ecmaVersion 8 ecmaFeat
  • 允许在 conda env 中使用系统 python?

    有没有办法强制 conda 在给定环境中使用 python 的系统版本 以及所有系统库 我在 shell 中默认启用了 conda 这可能会有点烦人 因为如果我尝试运行系统 python 应用程序 它会获得与预期不同的 python 版本
  • R:表格格式

    我有一个包含以下列的 Excel 文件 Column1 Column2 Column3 ab bb 0 5 ab bc 0 1 ab cd 0 7 ab dd 0 8 ac bb 0 2 ac bg 0 8 ac ee 0 8 ac dd
  • 结构中的内存布局差异

    我在 C 中有以下结构 struct A int a double b float c 该结构与添加了函数的结构之间的内存布局是否存在差异 struct B int a double b float c void foo B foo do
  • ios7 故事板项目不会移动

    我试图在我的视图控制器布局中移动故事板项目 但是当在模拟器中运行时 它们不会移动 它们似乎粘在我放置它们的上方的橙色虚线上 那些橙色线是什么 为什么我无法移动我的物品 Here s what it looks like in the sim
  • 使用不同的结构体定义来模拟 C 中的公共和私有字段

    我已经编写 C 语言相当长的时间了 并且显然知道 C 不支持结构中显式的私有和公共字段 然而 我 相信 我已经找到了一种相对干净的方法来实现这一点 而无需使用任何宏或巫术 并且我希望更深入地了解我可能忽略的可能问题 文件夹结构在这里并不是那
  • 您总是在发布后重定向吗?如果是,您如何管理?

    假设您正在提交一个表单 这会影响您的数据库 添加记录 删除记录 更新记录 您的请求如下所示 POST 应用程序 操作 更新 现在 假设您已完成更新 因此您希望将用户带到主页 Response sendRedirect application
  • 为什么你需要创建这些 json 读/写,而在 java 中你不需要创建这些 json 读/写?

    如果我错了 请纠正我 但是当使用 Java 和 Spring MVC 时 您不必创建这些额外的类来将 Java 类映射到 JSON 以及将 JSON 映射到类 为什么必须在 Play with Scala 中执行此操作 和Scala有关系吗
  • git merge --squash 和 gitcherry-pick 有什么区别?

    如果我在标准的主功能工作流程中工作 那么将功能分支压缩到主功能分支和将其挑选到主功能分支之间有什么区别 分支示例 m1 m2 master f1 f2 feature 我认为两者都有相同的输出 即 m1 m2 m3 master f1 f2
  • tsconfig.json 中模块类型的区别

    在 tsconfig json 中 compilerOptions target es5 module commonjs moduleResolution node sourceMap true emitDecoratorMetadata
  • module_init() 与 core_initcall() 与 Early_initcall()

    在驱动程序中 我经常看到使用这三种类型的初始化函数 module init core initcall early initcall 在什么情况下我应该使用它们 另外 还有其他的初始化方式吗 它们决定内置模块的初始化顺序 司机们会使用dev
  • 使用 c# 的 StrucLayout 和 FieldOffset 表示联合位域

    据我了解 为了在 C 中表示联合 我需要使用 StructLayout LayoutKind Explicit 和 FieldOffset x 属性来指定联合内的字节偏移量 但是 我有一个想要表示的以下联合 并且 FieldOffset a
  • 在 Autodesk Viewer 中查找可见零件的中心点

    请原谅这个问题的模糊性 但是在查看器的模型中 我想知道如何建立可见部分的中心点 当我在带有隐藏部分的模型上调用 fit to view 时 我可以看到查看器中出现一个点 它似乎恰好代表了这一点 可见部分的中心 如何在代码中检索该点的坐标 小
  • 在 Python 中绘制正弦曲线的傅里叶变换

    以下 python 程序绘制正弦曲线 import matplotlib pyplot as plt import numpy as np Canvas plt style use ggplot Frequency Oscillations
  • 扩展蓝图类?

    我想覆盖timestamps 函数中发现Blueprint班级 我怎样才能做到这一点 e g public function up Schema create users function Blueprint table table gt
  • 使用占位符和 ngModel 动态生成输入元素

    我想以角度 2 动态生成输入元素 我有占位符标题数组和值数组 如下所示 在我的组件中 我有两个映射 如下所示 其中两个映射的键相同 将值映射到标题 const placeholderMap fullName Name value Produ
  • 蛋糕控制台 2.2.1:烘焙错误

    运行 MAMP 的 OSX 机器 CakePHP 2 2 1 已正确安装和配置 这意味着当我浏览到 Index php 文件时 所有绿色条都显示出来 我已经完成了博客教程 并且正在开发我的第二个应用程序 其中脚手架已启动并运行 现在我第一次
  • 如何在读取文件期间从每一行中删除换行符? [复制]

    这个问题在这里已经有答案了 我正在从包含一个 字 行的文件中读取行 例如 dog cat person tree 每个单词还包含一个换行符 n特点 我想将它们读入列表并丢弃换行符 我设计的方法是阅读readlines 然后将列表处理为str
  • 如何处理数据库中的巨大结果集

    我正在设计一个多层数据库驱动的 Web 应用程序 SQL 关系数据库 用于中间服务层的 Java 用于 UI 的 Web 语言其实并不重要 中间服务层执行数据库的实际查询 用户界面只是要求某些数据 并不知道它是由数据库支持的 问题是如何处理