大数据量(已测500W或1000W数据)分页读取的一点心得体会

王朝java/jsp·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

今日小弟在CSDN论坛里发了个“500W数据分页性能测试”的帖子,想不到引起众多朋友的关注,于是打算写份心得体会~~~~本来测试的时候用的1000W数据测试,不过小弟的机器只有512的内存,用1000W,性能虽说也还很好,但我的机器却不能再干别的了,于是改为500W,但性能几乎没什么差别!只是1000W启动更慢,内存消耗更大~~500W消耗90多M,1000W就要消耗180多M……

帖子地址:http://community.csdn.net/Expert/topic/3132/3132779.xml?temp=9.943789E-02

首先数据量大了之后,我们先分析下,瓶颈在哪里?我们就以比较经典和流行的那个存储过程分页作为例子~~那个存储过程都干了些什么呢?他建立了一个临时内存表,用来存放ID,致使ID连贯,可以任意获取某个位置的数据,但如果数据量十分大了之后,比如500W或者1000W,即便只读ID也是很费劲的~~~那解决问题的关键就在于,如何不读这个ID,数据库那边是不好操作了,于是,我们可以把这个ID索引读到程序中来,然后根据这个索引读数据,不就快了吗?慢也就是第一次的时候慢~~ 于是,我读取了这个ID列到程序总,并组织成为一个ArrayList,然后根据访问这个AL的元素定位需要数据的真实ID,有了ID就好办了,再根据ID获取数据,还困难吗?

接下来,出现了新的问题,如果数据频繁更新怎么办?重新建立AL?不,不能怎么死脑筋,换个方式?我为什么不能在更改数据的同时更改这个AL呢?这就不用重新建立了,OK,核心思想就是这样~~

进一步就是一些麻烦的过程,还好没什么难度,只是麻烦而已,那就是每次更新数据库的同时同步更新缓存中的AL,要实现这个,是有一点麻烦~~于是我将这些操作全部封装,成了一个实体控制类,用DataRow和DataTable作为实体,内部实现了增删改的方法,并且在实现的同时,同步更新了AL

大概的原理就是这样,其实很简单,只是思路问题而已~~~

说说这个方法的缺陷吧,有,当然有,通过这个方法获取数据,获取的规则,比如排序,比如过滤,必须预先指定,不能随时更换~~~

关于进一步提高,小弟想到一个办法,还可以进一步提高性能,但现在还没实现,还在构思,就不多说了,如果实现成功再说吧,免得浪费大家的时间~~~

最后,介绍下我的这个实体控制类^_^

1、实现了缓存加速功能,上面说的办法就是核心思想,当然也支持常规的存储过程和ID过滤方式,并且集成好了的。

2、不用XML,可以自动根据数据库结构,建立映射对象。

3、解决数据并发更新冲突(还在制作中)

4、可以根据对象建立数据表。

5、用DataTable和DataRow作为实体,我觉得蛮好,通用且方便~~~~

6、单条查询、集合查询、数据的单条和集合的“增加”“删除”“修改”这些自然是实现的了

不知道算个什么,呵呵,如果有需要的朋友可以与我联系~~~

cnlamar

hotmail.com

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
 
© 2005- 王朝網路 版權所有 導航