ODAC (V9.5.15) 学习笔记(二十)大数据量获取处理

ODAC获取数据的效率比较高,在Web程序中希望能够更快获取第一页的数据时,可以有几种方式:

1、在数据库中进行分页处理;

2、获取所有数据,只是快速返回第一页数据。

第一种方案对应用服务器资源消耗最小,对数据库消耗略大,在客户需要对全数据进行灵活过滤、查找、统计时就有些不够用了,另外对耗时较大的SQL查询就不如第二种方案速度快,对数据库压力也要大些,并且需要编写程序来完成。在Delphi下我考虑使用第二种方案,尤其是在使用uniGUI+ODAC配合使用时。第二种方案对应于服务器内存压力略大,并且要求快速获取第一页数据,为此做了个实验:

1、单表中有24万条记录

2、使用一次性获取全部记录,并放在服务器内存中,由uniGUI的网格进行自动分页处理。

3、非一次性获取全部记录时,需要快速获取第一页数据,将TOraQuery组件的FetchRows设置与TUniDBGrid组件的WebOptions.PageSize一致(不是必须的,只是觉得这样对显示第一页更有效率些),再通过启动一个线程,在后台通过TOraQuery组件的FetchAll属性设为True来获取全部数据。TOraQuery的数据量发生变化后,在TUniDBGrid组件中滚动任意记录都会触发记录数与分页数的自动更新,所以不需要在获取全部数据后刷新网格。

代码如下:

procedure TMainForm.UniButton11Click(Sender: TObject);
var
  d : DWORD;
begin
  //计时
  d := GetTickCount;
  //每个数据包获取的记录数,建议与网格的每页数保持一致
  UniMainModule.OraQuery7.FetchRows := UniDBGrid7.WebOptions.PageSize;
  //是否一次性获取
  UniMainModule.OraQuery7.FetchAll := UniCheckBox7.Checked;
  //开启表,如果是非一次性获取,则中获得了第一个数据包的记录数
  UniMainModule.OraQuery7.Open;
  //花费时间
  UniLabel17.Caption := Format(‘%d ms‘, [GetTickCount - d]);
  //开启线程获取
  if not UniCheckBox7.Checked then
    TFetchThread.Create(UniMainModule.OraQuery7);
end;

UniCheckBox7.Checked决定了是否采用一次性获取的选项,实验显示:

1、一次性获取数据模式,显示第一页花费了3000ms左右时间,内存占用约180M,关闭数据集后内存减少为10M左右,说明内存释放非常干净。

2、非一次性获取数据模式,显示第一页花费了约20ms左右时间,后台读取数据没有影响前端数据的展示、滚动等操作,最终内存占用与关闭后释放同一次性获取模式。

后台获取数据的线程代码如下:

  TFetchThread = class(TThread)
  private
    FDataSet :  TOraQuery;
  public
    procedure Execute; override;
    constructor Create(ADataSet : TOraQuery);
  end;
{ TFetchThread }

constructor TFetchThread.Create(ADataSet: TOraQuery);
begin
  FDataSet := ADataSet;
  FreeOnTerminate := True;
  inherited Create;
end;

procedure TFetchThread.Execute;
begin
  inherited;
  if Assigned(FDataSet) then
  begin
    FDataSet.FetchAll := True;
    while not FDataSet.Fetched do
      Sleep(10);

    MainForm.Caption := ‘refresh‘;
  end;
end;

效果基本满意

时间: 2024-08-05 11:13:18

ODAC (V9.5.15) 学习笔记(二十)大数据量获取处理的相关文章

ODAC(V9.5.15) 学习笔记(十二)TOraLoader

名称 类型 说明 Columns TDAColumns 需要载入数据的每个字段定义 LoadMode TLoadMode 载入模式,包括: lmDirect 通过内部数据缓冲区载入到数据库中 lmDML    将数据转换为DML语句再提交到数据库中 TableName 载入数据的表名称 CreateColumns 根据TableName指定的表在数据库中的定义创建所有的列,并存储在Columns中.Columns中以前定义的内容将被清除 Load 开始载入数据,触发OnPutData 或OnGe

ODAC(V9.5.15) 学习笔记(十八) 数据集缓冲模式

数据集的缓冲模式(Cached mode)是将数据库服务器的数据缓冲在客户端内存中进行处理,不再依赖服务器.只有当数据需要提交数据库服务器进行保存时,才将变更数据一次性提交数据库服务器. 数据集缓冲模式的最大优点是减少了对数据库服务器的资源消耗,甚至可以在网络断开的情况下,对数据进行处理然后在网络连接后,提交数据库保存.与传统的2层架构数据库软件相比,有巨大的抗网络故障能力.包PB在内的绝大多数2层架构软件,一旦网络临时中断,导致数据库连接中断,客户端所有未能保存的修改将被丢弃,而在ODAC中这

ODAC(V9.5.15) 学习笔记(十六)直接访问模式

直接访问模式(Direct mode)是ODAC最大的特色之一,即不需要安装Oracle客户端,ODAC越过了OCI(Oracle Call Interface ),使用TCP/IP协议就可以直接与Oracle服务器通信,使得ODAC程序的部署非常方便,性能也非常高. 要设置直接访问模式,只需要将连接组件的选择项Direct设为True Session.Options.Direct := True; 其他的参数设置同正常模式.使用直接访问模式的优势是不需要安装Oracle客户端,部署更方便,资源

ODAC(V9.5.15) 学习笔记(十九)主键值自动生成

ODAC支持通过Oracle的序列来自动生成表的主键功能.这个过程允许在客户端自动完成,不需要过多代码.这个对一些要求自动增长字段做主键的场合非常有用.其实现步骤为: 1.数据库必须先建立生成主键的序列. 2.设置数据集的KeySequence属性,指向数据库中的序列. 3.设置数据集的SequenceMode属性,明确是在新增时还是修改时生成序列值,并赋值给数据集的主键. 4.设置数据集的KeyFields属性,指向表的关键字段.如果KeyFields中有多个字段时,序列值会自动赋值给第一个字

ODAC(V9.5.15) 学习笔记(十四)TCRBatchMove

名称 类型 说明 AbortOnKeyViol Boolean 在处理数据时,如果发生主键冲突或主键校验失败时,是否中断 AbortOnProblem Boolean 发生问题时是否中断 ChangedCount Integer 目标数据集变动记录数 CommitCount Integer 用于设置一次性移动到目标数据集中并提交的记录数,如果设置为0,则以目标数据集每32Kb空间的记录数 Destination TDataSet 目标数据集 Source TDataSet 源数据集 Mode T

ODAC(V9.5.15) 学习笔记(十)TVirtualTable

名称 类型 说明 Options TVirtualTableOptions 选择项,包括: voPersistentData:在数据集关闭时不处理其相关数据内容 voStored:设计期对数据集的处理以及录入的数据将保存在DFM文件中 AddField 增加一个字段,需要Active=True后生效 DeleteField 删除一个字段 DeleteFields 删除所有字段 Assign 从另外一个数据集中复制字段及其数据,需要Active=True后生效 Clear 清除内存数据集的所有记录

马哥学习笔记二十四——分布式复制快设备drbd

DRBD: 主从 primary: 可执行读.写操作 secondary: 文件系统不能挂载 DRBD: dual primay, 双主(基于集群文件系统的高可用集群) 磁盘调度器:合并读请求,合并写请求: Procotol:drbd数据同步协议 A: Async, 异步  数据发送到本机tcp/ip协议栈 B:semi sync, 半同步  数据发送到对方tcp/ip协议 C:sync, 同步  数据到达对方存储设备 DRBD Source: DRBD资源 资源名称:可以是除了空白字符外的任意

【Unity 3D】学习笔记二十八:unity工具类

unity为开发者提供了很多方便开发的工具,他们都是由系统封装的一些功能和方法.比如说:实现时间的time类,获取随机数的Random.Range( )方法等等. 时间类 time类,主要用来获取当前的系统时间. using UnityEngine; using System.Collections; public class Script_04_13 : MonoBehaviour { void OnGUI() { GUILayout.Label("当前游戏时间:" + Time.t

angular学习笔记(二十八)-$http(6)-使用ngResource模块构建RESTful架构

ngResource模块是angular专门为RESTful架构而设计的一个模块,它提供了'$resource'模块,$resource模块是基于$http的一个封装.下面来看看它的详细用法 1.引入angular-resource.min.js文件 2.在模块中依赖ngResourece,在服务中注入$resource var HttpREST = angular.module('HttpREST',['ngResource']); HttpREST.factory('cardResource

Android学习笔记二十九之SwipeRefreshLayout、RecyclerView和CardView

Android学习笔记二十九之SwipeRefreshLayout.RecyclerView和CardView 前面我们介绍了AlertDialog和几个常用的Dialog,ProgressDialog进度条提示框.DatePickerDialog日期选择对话框和TimePickerDialog时间选择对话框.这一节我们介绍几个新的API控件SwipeRefreshLayout.RecyclerView和CardView,这几个API控件都是google在Android5.0推出的.下面我们来学