一种基于数据读取器流式读取的服务器端动态表格构建方法与流程

摘要: 本发明涉及web服务器端数据处理,具体涉及一种在服务器端通过数据库数据读取器进行流式读取并动态构建网页表格的技术方案。背景技术:1、在基于web的服务器端应用程...
一种基于数据读取器流式读取的服务器端动态表格构建方法与流程

本发明涉及web服务器端数据处理,具体涉及一种在服务器端通过数据库数据读取器进行流式读取并动态构建网页表格的技术方案。

背景技术:

1、在基于web的服务器端应用程序中,将数据库查询结果以表格形式呈现给用户端页面是一项基础且高频的数据处理需求。现有技术中,web服务器端开发框架普遍提供了数据绑定控件或模板引擎来完成数据库查询结果到网页表格的转换。

2、以数据绑定控件方案为例,开发者将一个数据源对象(例如数据集dataset或数据表datatable)绑定至表格控件,由控件内部的模板渲染机制自动遍历数据源中的每一行记录,按照预定义的列模板生成对应的网页表格行和单元格。在这一方案下,表格呈现样式受制于控件模板的固有渲染能力——模板通常只能按列统一设定字体、颜色和对齐方式,无法对不同行、不同列的单个单元格分别指定不同的样式属性。当业务场景要求相邻明细行采用交替背景色、某列数值型数据右对齐而另一列文本左对齐时,数据绑定控件的表达能力捉襟见肘。

3、另有一部分开发者采用全量加载方案:先将数据库查询结果完整填充至一个内存中的数据集对象(如dataset),而后通过编程遍历该数据集中的每一行、每一列来手工拼接超文本标记语言(html)字符串,最终将拼接完毕的html字符串整体写入页面输出流。该方案虽然能够获得对每个单元格样式的控制权,但数据集对象的全量加载机制决定了其必须在内存中同时持有查询结果的全部行数据,以及每一行的元数据结构和各列状态信息。当查询结果只包含数十条记录时,内存占用维持在十几兆字节级别,尚在可接受范围内;但当业务场景中单次查询返回三千至五千条明细记录时,数据集对象的内存占用会膨胀至三百兆字节以上,对服务器内存资源造成显著压力。

4、此外,在明细数据展示与汇总统计并存的场景下,典型的实现方式是先后执行两次独立的数据库查询:第一次查询返回全部明细行用于表格填充,第二次查询在明细表格之外另行执行聚合查询获取合计值。由于两次查询分别发生在两次独立的数据库请求中,数据库服务器会在这两次查询之间的时间窗口内接收到其他会话的写入事务并提交,导致第二次聚合查询所基于的数据快照与第一次明细查询时的数据快照不一致——即最终展示给用户的明细行逐条累加之和,与页面底部显示的合计数字不相等。

技术实现思路

1、本发明的目的在于提供一种基于数据读取器流式读取的服务器端动态表格构建方法,以解决现有技术中数据绑定控件无法对单个单元格进行独立样式控制、全量数据集加载导致内存占用过高、以及明细查询与聚合查询分离导致数据不一致的技术问题。

2、为实现上述目的,本发明提供如下技术方案:

3、本方案在web服务器端处理器上执行以下步骤。第一步,建立与数据库服务器的连接会话,通过该连接会话创建一个数据查询命令对象。第二步,调用该数据查询命令对象的数据读取方法,从数据库服务器获取一个单向只进的数据读取器对象——该读取器不在调用方进程内存中缓冲结果集,而是以游标方式逐行从数据库服务器的网络数据流中读取一条记录。第三步,进入基于该数据读取器对象的逐行读取循环。循环体内针对每一行数据记录执行以下子操作:实例化一个新的网页表格行对象;实例化一个固定长度的网页表格单元格数组;将当前数据记录中各字段转换为字符串后,逐一赋给该单元格数组中对应下标单元格的内部超文本属性,以此完成单元格内容的写入;同时通过设置各单元格对象的背景色属性和对齐属性,独立控制每一个单元格的呈现样式;之后将已完成赋值的所有单元格逐一添加至该表格行对象中;最后将该表格行对象添加至作为页面输出目标的表格对象中。第四步,在逐行读取循环退出后,关闭该数据读取器对象以释放数据库服务器侧的游标资源,但保持连接会话对象处于打开状态,不执行断开或归还连接池的操作。第五步,在保持同一连接会话的前提下,依次构造至少两条聚合查询命令文本——第一条用于计算明细记录中数量字段的合计值,第二条用于计算数量字段与单价字段乘积的合计值——分别赋给数据查询命令对象的命令文本属性,每次赋值后调用标量执行方法获取对应的标量聚合结果。第六步,利用所获取的两个标量聚合结果构造至少一个汇总表格行对象,将该汇总表格行对象追加到前述的目标表格对象中。至此,完整的明细加汇总的动态网页表格在服务器端组装完毕。

4、上述技术方案的有益效果体现在以下三个方面。

5、其一,单元格样式独立控制的实现。本方案完全抛弃了数据绑定控件的模板渲染路径,改为在逐行读取循环内通过纯代码逐一实例化表格行对象和表格单元格对象,借助单元格对象的背景色属性和对齐属性的直接赋值机制,实现对每一行中每一个单元格颜色的独立指定和对齐方向的独立控制。在一个包含五列的业务表格中,可以在同一行内将第一列设定为左对齐、第二列和第三列设定为居中对齐、第四列和第五列设定为右对齐;同时可以根据行号的奇偶性在不同行之间切换背景色,实现相邻行的交替着色效果,而无需受限于控件模板的列级统一样式约束。

6、其二,低内存占用的流式数据处理。本方案采用数据库数据读取器的流式读取特性——该读取器不在web服务器进程内存中缓存完整的结果集,而是逐行从数据库服务器传输的单向数据流中消耗记录。在while(read())循环的每一次迭代中,web服务器内存中仅同时存在一条当前记录的字段值、一个表格行对象和固定数量的表格单元格对象;上一轮迭代中的记录数据在下一轮迭代开始后即可被垃圾回收。对于单次返回三千条明细记录的业务场景,本方案的内存峰值为全量数据集加载方案的五分之一至十分之一,避免了数据集对象在内存中同时持有全部行数据及元数据结构的开销。

7、其三,明细与汇总数据的一致性保障。本方案将明细查询与聚合查询置于同一个数据库连接会话的生命周期内顺序执行。数据库连接会话在默认的事务隔离级别下,其读视图自首次数据读取操作起即被确定,同一会话内后续的查询操作均基于同一快照。本方案在明细行的流式读取全部完成并关闭数据读取器后,保持连接会话不中断,立即在同一会话内先后执行数量合计和金额合计的两条聚合查询。由于从明细查询到聚合查询的整个过程中连接会话从未释放,中间不存在其他数据库事务能够插入修改该会话所读取数据的机会窗口,从而保证了最终呈现给用户的明细行累加结果与页面底部汇总数字的严格一致性。

1.一种基于数据读取器流式读取的服务器端动态表格构建方法,其特征在于,包括至少以下步骤:

2.根据权利要求1所述的方法,其特征在于,所述通过各单元格的背景色属性独立设定呈现样式,包括:在所述逐行读取循环中维护一个行号计数器,当行号计数器为偶数时将当前行各单元格的背景色属性设为第一颜色值,当行号计数器为奇数时将当前行各单元格的背景色属性设为第二颜色值,由此实现相邻明细行的交替着色。

3.根据权利要求1所述的方法,其特征在于,所述通过各单元格的对齐属性独立设定呈现样式,包括:对表格单元格数组中至少两个不同位置的单元格分别设定不同的对齐属性值,使数值型字段对应的单元格采用右对齐、文本型字段对应的单元格采用左对齐、标题型字段对应的单元格采用居中对齐。

4.根据权利要求1所述的方法,其特征在于,所述标量聚合结果包括:第一聚合查询获得的明细记录总条数的合计值,以及第二聚合查询获得的明细记录中指定字段与另一字段乘积的合计值;所述汇总表格行对象在所述目标表格对象中位于全部明细行之后。

5.根据权利要求1至4任一项所述的方法,其特征在于,所述数据读取器对象的逐行读取循环与所述至少两条聚合查询命令的标量执行,共享同一个数据库连接会话对象,明细行渲染完成后、聚合查询执行前,仅关闭所述数据读取器对象而不关闭所述连接会话对象,以此保证明细数据与汇总数据属于同一数据库读视图内的快照一致数据。

6.一种基于数据读取器流式读取的服务器端动态表格构建系统,其特征在于,包括:

7.根据权利要求6所述的系统,其特征在于,所述动态构建模块还用于:在所述逐行读取循环中维护一个行号计数器,当行号计数器为偶数时将当前行各单元格的背景色属性设为第一颜色值,当行号计数器为奇数时将当前行各单元格的背景色属性设为第二颜色值。

8.根据权利要求6所述的系统,其特征在于,所述流式读取模块与所述聚合查询模块共享同一个连接会话对象,所述聚合查询模块在所述流式读取模块关闭所述数据读取器对象后、执行聚合查询前,保持所述连接会话对象处于打开状态。

9.一种终端设备,其特征在于,包括存储器、处理器及存储在所述存储器上并可在所述处理器上运行的计算机程序,所述处理器执行所述程序时实现如权利要求1至5任一项所述方法的步骤。

10.一种计算机可读存储介质,其上存储有计算机程序,其特征在于,所述程序被处理器执行时实现如权利要求1至5任一项所述方法的步骤。