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(); MainForm.Caption := 'refresh';
end;
end;

效果基本满意

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

  1. ODAC(V9.5.15) 学习笔记(十五)数据离线模式

    数据离线模式(Disconnected Mode)是指数据库只有在需要的时候才连接,数据的处理放在客户端内存缓冲区中完成.这样做最大的好处是减少了网络资源依赖,对数据库服务器的资源开销和压力也减少.如 ...

  2. PowerDesigner 15学习笔记:十大模型及五大分类

    个人认为PowerDesigner 最大的特点和优势就是1)提供了一整套的解决方案,面向了不同的人员提供不同的模型工具,比如有针对企业架构师的模型,有针对需求分析师的模型,有针对系统分析师和软件架构师 ...

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

    名称 类型 说明 Columns TDAColumns 需要载入数据的每个字段定义 LoadMode TLoadMode 载入模式,包括: lmDirect 通过内部数据缓冲区载入到数据库中 lmDM ...

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

    ODAC支持通过Oracle的序列来自动生成表的主键功能.这个过程允许在客户端自动完成,不需要过多代码.这个对一些要求自动增长字段做主键的场合非常有用.其实现步骤为: 1.数据库必须先建立生成主键的序 ...

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

    数据集的缓冲模式(Cached mode)是将数据库服务器的数据缓冲在客户端内存中进行处理,不再依赖服务器.只有当数据需要提交数据库服务器进行保存时,才将变更数据一次性提交数据库服务器. 数据集缓冲模 ...

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

    直接访问模式(Direct mode)是ODAC最大的特色之一,即不需要安装Oracle客户端,ODAC越过了OCI(Oracle Call Interface ),使用TCP/IP协议就可以直接与O ...

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

    名称 类型 说明 AbortOnKeyViol Boolean 在处理数据时,如果发生主键冲突或主键校验失败时,是否中断 AbortOnProblem Boolean 发生问题时是否中断 Change ...

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

    名称 类型 说明 Options TVirtualTableOptions 选择项,包括: voPersistentData:在数据集关闭时不处理其相关数据内容 voStored:设计期对数据集的处理 ...

  9. python3.4学习笔记(二十四) Python pycharm window安装redis MySQL-python相关方法

    python3.4学习笔记(二十四) Python pycharm window安装redis MySQL-python相关方法window安装redis,下载Redis的压缩包https://git ...

  10. python3.4学习笔记(二十六) Python 输出json到文件,让json.dumps输出中文 实例代码

    python3.4学习笔记(二十六) Python 输出json到文件,让json.dumps输出中文 实例代码 python的json.dumps方法默认会输出成这种格式"\u535a\u ...

随机推荐

  1. [MSSQL] Useful SQL Scripts - CalendarBase

    Useful SQL scripts DECLARE @StartDate DATETIME DECLARE @EndDate DATETIME DECLARE @FiscalBeginMonth I ...

  2. Java基础的一次总结

    二重循环核心:就是我们学习的内容中,一直在不停的打印图形,当我们写完所有打印图形的题目后,我们站在一个 新的高度上来看二重循环解决图形问题的时候.我们知道核心思想就是:就是寻找外层循环变量i和内层循环 ...

  3. JavaScript toFixed function Not Rouding

    JavaScript库函数toFixed用来将给定的数字四舍五入为指定的小数位数,W3school上有详细的介绍.众所周知,在处理小数位四舍五入的时候存在两种方式:一种是逢五进一,如5.885保留两位 ...

  4. js里各浏览器解析XML,支持IE、火狐、Chrome等

    js在chrome中加载XML,js加载XML支持ff,IE6+,Opera等浏览器 见代码: <!doctype html> <html lang="en"&g ...

  5. java 初学者需注意问题

    1.Java为什么能跨平台运行? Java语言编写的程序既是编译型的,又是解释型的.程序代码经过编译之后转换为一种Java字节码的中间语言,Java虚拟机即JVM将对字节码进行解释和运行.编译只进行一 ...

  6. 安装 Autoconf 2.69版

    发生错误configure.ac:8: error: Autoconf version 2.64 or higher is required 1.检查版本 [root@localhost Deskto ...

  7. Java中Atomic包的实现原理及应用

    1. 同步问题的提出 假设我们使用一个双核处理器执行A和B两个线程,核1执行A线程,而核2执行B线程,这两个线程现在都要对名为obj的对象的成员变量i进行加1操作,假设i的初始值为0,理论上两个线程运 ...

  8. Inno setup 安装*.inf文件_示例

    nno setup 调用*.Inf文件的条目区段名称_示例 首先自己编写一个INF文件来供 Inno setup 进行测试: ;复制以下代码到记事本然后另存为123.inf .然后把123.inf文件 ...

  9. Java 中的instanceof简单讲解

    Java 中的instanceof 运算符是用来在运行时指出对象是否是特定类的一个实例.instanceof通过返回一个布尔值来指出,这个对象是否是这个特定类或者是它的子类的一个实例. 用法:resu ...

  10. [转]如果我有jQuery背景,我应该如何切换到AngularJS的思维模式?

    导言 stackoverflow上有一个人问了一个问题:如果我有jQuery背景,我应该如何切换到AngularJS的思维模式? 有一个回复非常经典,获得了两千多票. 为了让国内开发者也能领略到其中的 ...