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();
    MainForm.Caption := 'refresh';
  end;
end;
效果基本满意
ODAC (V9.5.15) 学习笔记(二十)大数据量获取处理的更多相关文章
- ODAC(V9.5.15) 学习笔记(十五)数据离线模式
		数据离线模式(Disconnected Mode)是指数据库只有在需要的时候才连接,数据的处理放在客户端内存缓冲区中完成.这样做最大的好处是减少了网络资源依赖,对数据库服务器的资源开销和压力也减少.如 ... 
- PowerDesigner 15学习笔记:十大模型及五大分类
		个人认为PowerDesigner 最大的特点和优势就是1)提供了一整套的解决方案,面向了不同的人员提供不同的模型工具,比如有针对企业架构师的模型,有针对需求分析师的模型,有针对系统分析师和软件架构师 ... 
- ODAC(V9.5.15) 学习笔记(十二)TOraLoader
		名称 类型 说明 Columns TDAColumns 需要载入数据的每个字段定义 LoadMode TLoadMode 载入模式,包括: lmDirect 通过内部数据缓冲区载入到数据库中 lmDM ... 
- ODAC(V9.5.15) 学习笔记(十九)主键值自动生成
		ODAC支持通过Oracle的序列来自动生成表的主键功能.这个过程允许在客户端自动完成,不需要过多代码.这个对一些要求自动增长字段做主键的场合非常有用.其实现步骤为: 1.数据库必须先建立生成主键的序 ... 
- ODAC(V9.5.15) 学习笔记(十八)	数据集缓冲模式
		数据集的缓冲模式(Cached mode)是将数据库服务器的数据缓冲在客户端内存中进行处理,不再依赖服务器.只有当数据需要提交数据库服务器进行保存时,才将变更数据一次性提交数据库服务器. 数据集缓冲模 ... 
- ODAC(V9.5.15) 学习笔记(十六)直接访问模式
		直接访问模式(Direct mode)是ODAC最大的特色之一,即不需要安装Oracle客户端,ODAC越过了OCI(Oracle Call Interface ),使用TCP/IP协议就可以直接与O ... 
- ODAC(V9.5.15) 学习笔记(十四)TCRBatchMove
		名称 类型 说明 AbortOnKeyViol Boolean 在处理数据时,如果发生主键冲突或主键校验失败时,是否中断 AbortOnProblem Boolean 发生问题时是否中断 Change ... 
- ODAC(V9.5.15) 学习笔记(十)TVirtualTable
		名称 类型 说明 Options TVirtualTableOptions 选择项,包括: voPersistentData:在数据集关闭时不处理其相关数据内容 voStored:设计期对数据集的处理 ... 
- python3.4学习笔记(二十四) Python pycharm window安装redis MySQL-python相关方法
		python3.4学习笔记(二十四) Python pycharm window安装redis MySQL-python相关方法window安装redis,下载Redis的压缩包https://git ... 
- python3.4学习笔记(二十六) Python 输出json到文件,让json.dumps输出中文 实例代码
		python3.4学习笔记(二十六) Python 输出json到文件,让json.dumps输出中文 实例代码 python的json.dumps方法默认会输出成这种格式"\u535a\u ... 
随机推荐
- node-webkit教程(15)当图片加载失败的时候
			在node-webkit教程(14)禁用缓存中,简单讲了当前禁用缓存的几种方法. 在实际开发过程中,我遇到了一个因为缓存引起的诡异的问题.应用场景如下: 在一个编辑器里,不停的向画布上添加svg或者其 ... 
- Mac系统下lipo, ar, nm等工具的使用简介
			引言 开发第三方库时, 如果没有进行特殊处理, 很容易把其他第三方库的符号暴露出来, 导致链接时产生符号重复. 如下图所示 如果用户链接了其他版本的libjpeg, 会因为入口地址不正确让程序直接崩溃 ... 
- [Python爬虫] Selenium获取百度百科旅游景点的InfoBox消息盒
			前面我讲述过如何通过BeautifulSoup获取维基百科的消息盒,同样可以通过Spider获取网站内容,最近学习了Selenium+Phantomjs后,准备利用它们获取百度百科的旅游景点消息盒(I ... 
- 利用模拟退火提高Kmeans的聚类精度
			http://www.cnblogs.com/LBSer/p/4605904.html Kmeans算法是一种非监督聚类算法,由于原理简单而在业界被广泛使用,一般在实践中遇到聚类问题往往会优先使用Km ... 
- ie下不显示图片
			IE支持的图片是必须为RGB三原色的,保存图片时,必须“另存为web可用的格式...” 
- js函数的调用问题
			1.js函数的调用方式有三种.请问以下“二”处的几行代码有什么猫腻? //一 事件调用 btn.onclick=fn; //二 直接调用(window调用) fn(); //自上而下解析到这一行的时候 ... 
- iOS开发——高级技术&签名机制
			签名机制 最近看了objc.io上第17期中的文章 <Inside Code Signing> 对应的中文翻译版 <代码签名探析> ,受益颇深,对iOS代码签名机制有了进一步的 ... 
- css3动画animation
			动画:animation animations这物似乎还是只在webkit,moz核心的浏览器上起作用 <!DOCTYPE html><html lang="en&qu ... 
- Eclipse连接到My sql数据库之前操作
			Eclipse连接到My sql数据库之前操作 1:首先是安装My sql数据库(为了减少你的麻烦,按照下面的连接,下载即可)百度云链接:http://pan.baidu.com/s/1mitWmbm ... 
- 使用gulp进行React任务的构建
			如果你不熟悉gulp的操作,可以看下下面的教程: gulp学习笔记1 gulp学习笔记2 gulp学习笔记3 gulp学习笔记4 对于gulp在react中的构建,找了很多资料,看了很多文章,也根据文 ... 
