一是要有高效的、针对海量数据的全文索引,另一方面就是要能对不同介质的存储进行虚拟化管理。
全方位的内容查询就是能对当前数据、历史数据,能对在线存储、离线存储,能对复制数据、备份数据和归档数据,能对不同应用软件产生的不同格式的数据进行全方位的查询。这是一个美好的目标,堪称数据管理的更高境界。
目前主流的存储介质有三类:磁盘、磁带和光盘,这些不同类型的介质所构成的存储设备环境的特性是不一样的。
在以下的文章中,我将以“办公自动化”系统为例,探讨如何在有着1000万条数据的MS SQL SERVER数据库中实现快速的数据提取和数据分页。以下代码说明了我们实例中数据库的“红头文件”一表的部分数据结构: CREATE TABLE [dbo][TGongwen] ( --TGongwen是红头文件表名 [Gid] [int] IDENTITY (1, 1) NOT NULL , --本表的id号,也是主键 [title] [varchar] (80) COLLATE Chinese_PRC_CI_AS NULL , --红头文件的标题 [fariqi] [datetime] NULL , --发布日期 [neibuYonghu] [varchar] (70) COLLATE Chinese_PRC_CI_AS NULL , --发布用户 [reader] [varchar] (900) COLLATE Chinese_PRC_CI_AS NULL , --需要浏览的用户。每个用户中间用分隔符“,”分开 ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY] GO 下面,我们来往数据库中添加1000万条数据: declare @i int set @i=1 while @i<=250000 begin insert into Tgongwen(fariqi,neibuyonghu,reader,title) values('2004-2-5','通信科','通信科,办公室,王局长,刘局长,张局长,admin,刑侦支队,特勤支队,交巡警支队,经侦支队,户政科,治安支队,外事科','这是最先的25万条记录') set @i=@i+1 end GO declare @i int set @i=1 while @i<=250000 begin insert into Tgongwen(fariqi,neibuyonghu,reader,title) values('2004-9-16','办公室','办公室,通信科,王局长,刘局长,张局长,admin,刑侦支队,特勤支队,交巡警支队,经侦支队,户政科,外事科','这是中间的25万条记录') set @i=@i+1 end GO declare @h int set @h=1 while @h<=100 begin declare @i int set @i=2002 while @i<=2003 begin declare @j int set @j=0 while @j<50 begin declare @k int set @k=0 while @k<50 begin insert into Tgongwen(fariqi,neibuyonghu,reader,title) values(cast(@i as varchar(4))+'-8-15 3:'+cast(@j as varchar(2))+':'+cast(@j as varchar(2)),'通信科','办公室,通信科,王局长,刘局长,张局长,admin,刑侦支队,特勤支队,交巡警支队,经侦支队,户政科,外事科','这是最后的50万条记录') set @k=@k+1 end set @j=@j+1 end set @i=@i+1 end set @h=@h+1 end GO
问题描述 在通常的三层构架下 客户通过Browser请求Web服务器查询数据库 而查询结果是上千条甚至是上百万条记录 要求查询结果传送到客户端浏览器并分页显示
考虑因素
Web服务器的资源消耗 包括 内存(用来存储查询结果) 数据库相关资源(数据库连接对象 ResultSet对象等等)
DB服务器资源的消耗 包括游标 会话等等
网络开销 包括与数据库建立会话 传输查询结果等等
JDBC中的几个重要Class:
A ResultSet object maintains a cursor pointing to its current row of data Initially the cursor is positioned before the first row The next method moves the cursor to the next row and because it returns false when there are no more rows in the ResultSet object it can be used in a while loop to iterate through the result set
ResultSet是直接在数据库上建立游标 然后通过ResultSet的行位置定位接口来获得指定行位置的记录 当用户通过get方法获取具体纪录的内容时 ResultSet才从数据库把所需数据读到客户端
Oracle的ResultSet实现似乎会在本地缓存用户读取过的数据 导致内存消耗会随读取数据的增加而增加 这样 如果一次查询并读取海量数据 即使读出数据后马上丢弃(比如直接写入文件) 内存消耗也会随查询结果的增加而递增
The RowSet interface extends the standard java sql ResultSet interface A RowSet object may make a connection with a data source and maintain that connection throughout its life cycle in which case it is called a connected rowset A rowset may also make a connection with a data source get data from it and then close the connection Such a rowset is called a disconnected rowset A disconnected rowset may make changes to its data while it is disconnected and then send the changes back to the original source of the data but it must reestablish a connection to do so
RowSet是JDBC 中提供的接口 Oracle对该接口有相应实现 其中很有用的是 oracle jdbc rowset OracleCachedRowSet OracleCachedRowSet实现了ResultSet中的所有方法 但与ResultSet不同的是 OracleCachedRowSet中的数据在Connection关闭后仍然有效
解决方案一 直接使用ResultSet来处理
从ResultSet中将查询结果读入collection 缓存在>
以上就是关于如何在海量数据中实现感兴趣数据的检索识别和定位全部的内容,包括:如何在海量数据中实现感兴趣数据的检索识别和定位、SQL如何快速处理海量数据、Java中的大量数据查询等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)