异步数据访问(共7篇)
异步数据访问 篇1
摘要:针对B/S模式网络中后台数据与前台数据同步处理问题, 利用.NET编程技术, 提出了一种应用程序异步数据访问方法。经实际应用证明, 该设计方案是合理的, 并可以明显提高系统工作效率。
关键词:B/S模式网络,异步数据访问,NET平台,同步访问,并行访问
在B/S模式网络中, 应用程序经常需要从后台数据库服务器中读取一个大型的数据文件, 与此同时它还需要处理来自前端浏览器的请求。传统的文件访问都采用同步方法来处理这个问题, 即在文件输入输出进程中应用程序处于等待的状态。在.NET平台中, 可以通过创建后台数据处理线程的方法实现异步数据访问。
1 异步数据访问的基本思想
异步数据访问是.NET框架的许多区域都支持的功能, 例如:文件IO、流 IO、套接字 IO以及使用ASP.NET创建的XML Web services等。如果需要使用文件IO的异步数据访问, 首先需要创建的后台处理线程有启动文件输入输出进程的能力, 并且在运行这些进程的同时继续处理来自前台浏览器的请求。当输入输出进程结束时, 它会通知应用程序。使用这个方法, 可以实现前台和后台并行工作的状态。
.Net Framwork为异步操作提供了两种操作模式:使用IAsyncResult对象的异步操作或使用事件的异步操作。使用IAsyncResult设计模式的异步操作是通过Begin操作名称和End操作名称来实现。Begin操作名称方法开始异步操作, 并返回一个实现了IAsyncResult接口的对象。End操作名称方法可结束异步操作。如果调用End操作名称时IAsyncResult对象的异步操作还没有完成, 则End操作名称将在异步操作完成之前阻止调用线程。
在异步操作完成之前阻止应用程序有以下方法:从应用程序的主线程调用End操作名称, 阻止应用程序执行, 直到异步操作完成之后再继续执行, 或者使用AsyncWaitHandler阻止应用程序执行, 直到一个或多个操作完成之后再继续执行。
异步操作完成时不需要阻止应用程序可以用以下方法:定期检查IsCompleted属性, 操作完成后就调用End操作名称, 或者使用AsyncCallback委托来指定操作完成时要调用的方法。
FileStream类提供了BeginRead和EndRead方法从文件中异步读取字节。
2 异步数据访问过程的实现
2.1 异步数据读取
以一个指定文本文件内容读入内存为例, 说明此过程。首先在VS.NET中, 将默认类更名为ReadAsync;然后在Main方法中创建ReadAsync类的实例;最后创建ReadAsync类的构造函数。应用程序的大部分工作都在该构造函数中完成, 它首先检查是否确实存在该文件;然后使用FileInfo的OpenRead () 方法实例化FileStream对象;再设置用于从文件异步读取数据的参数, 开始数据的读取。数据读取通过FileStream类的BeginRead () 方法实现, 其格式为:
IAsyncResult BeginRead (byte[ ] array, int offset, int numBytes,
_AsyncCallback userCallback, object stateObject) ;
其中, userCallback是用户自己编写的代理方法, 当应用程序读取数据结束时, .NET将回叫应用程序;stateObject是用户提供的对象, 用于区分该异步读取数据请求与应用程序中其他读取数据请求。
2.2 异步数据写入
将数据异步写入文件的过程与异步读取数据的过程基本相同, 主要使用FileStream类的BeginWrite () 方法完成, 其格式为:
IAsyncResult BeginWrite (byte[] array, int offset, int numBytes,
_AsyncCallback userCallback, object stateObject) ;
该方法表示从文件中的offset位置开始将numBytes个字节的数据写到文件中。userCallback是用户自己编写的代理方法, 当应用程序读取数据结束时, .NET将回叫应用程序;stateObject是用户提供的对象, 用于区分该异步写入数据请求与应用程序中其他写入数据请求。
由于数据写入和数据读出的过程基本相同, 具体代码省略。
3 结束语
对于一般应用程序而言, 数据的异步存储并不是经常用到, 但对于B/S模式的动态网站来说, 却经常需要将数据保存到后台数据库中, 或者从后台数据库中读取大量数据。异步数据存储可以快速地完成这个过程。该算法在学院网站中使用后, 速度提升效果明显。
参考文献
[1] Ferrracchia F C.NET数据服务.毛尧飞, 译.北京:清华大学出版社, 2005
[2] Blair F B R.VB.NET高级编程.张加荣, 译.北京:清华大学出版社, 2005
[3] 使用.NET异步编程, http://dev.csdn.net/article/13/13378.shtm
[4] Onion F.ASP.NET基础教程.施 诺, 译.北京:清华大学出版社, 2003
[5] 微软公司.Programming with C#.北京:清华大学出版社, 2003
试对数据库访问技术进行研究 篇2
关键词:数据库访问技术;ADO.NET;安全性
中图分类号:TP311.13 文献标识码:A文章编号:1007-9599 (2011) 15-0000-01
Database Access Technology Research
Li Bin
(Guangdong Gaoyao People's Hospital,Zhaoqing526040,China)
Abstract:At present,along with the WWW growing,database access technology has gradually become the focus of the IT technical staff,understand and master the technology of database access,help to better the technology application.This article first elaborated the database access technology development,and based on the ADO.NET data access techniques are studied, for reference only.
Keywords:Database access technology;ADO.NET;Safety
一、数据库访问技术的发展
Web进入编程时代以前,在大部分IT人员眼里,数据访问仅仅是一个相对而言的问题,即需要使用到的所有数据都是自己事先准备好的。大多人关心的问题是如何选择性能好、价格低的数据库服务器,并且系统中涉及的全部模块必须和服务器兼容,其中客户机和服务器的应用是这种两层模型较为典型的范例。
在很短的时间内,三层系统模型发展成了Windows DNA,即Microsoft.NET服务器系统。该系统主要是利用统一的模型进行数据访问,其注重的是内容,而不是存储媒介及数据格式,具体的表达方式完全是建立在UDA的基础上的。为了提供一种通过VB方便访问OLE DB功能的途径,Microsoft设计了ADO。
ADO提供了对脱机记录集、服务器端游标和XML的支持,不仅增强了访问功能,同时还提高了访问效率。为了便于在Web环境下进行数据传输,Microsoft对ADO进行了优化。但是随着人们对可伸缩性以及协同工作能力要求的不断提高,ADO已经渐渐无法满足这一要求,ADO.NET随之出现。
二、ADO.NET数据访问技术
.NET框架是由微软公司推出的一个应用平台,在该平台中ADO.NET是Windows Forms和ASP.NET应用访问数据的标准服务,通过ADO.NET能够访问由.NET提供的不同类型的数据源。ADO.NET可以有效地从数据操作中把数据访问分解成若干个單独使用的组件。ADO.NET可以直接处理检索到的结果,或是将结果放入DataSet对象,并以特殊的方式向用户公开。
(一)ADO.NET的特点。ADO.NET是采用高度分布、松散的应用程序进行设计的,这类程序通常使用HTTP在逻辑程序连接中通信,XML便成为在该连接中交流数据的最佳选择,这是因为文本XML格式较为适合HTTP,当全部连接都处于同一网络时,XML通信提供了最大的灵活性。ADO.NET数据访问具有以下特点:1.不依赖于连续的活动连接。由于被打开的数据库连接会占用一定的系统资源,在正常情况下,数据库仅能维持少量的并发连接,并且维持这些连接会使应用程序的总体性能有所降低。而使用ADO.NET进行数据访问则是以较有节制使用连接的结构作为中心设计出来的,从而使应用程序连接到数据库的时间足以更新和获取数据。在这样的情况下,数据库未被大部分的时间空闲连接所占用,因此,能够为大量的用户提供服务。2.数据能够被缓存到数据集中。较为常见的数据任务是从数据库检索数据随后在对数据进行某些操作,例如显示及处理数据,或是将数据发给别的组件。但很多情况下,应用程序若是在每处理一条记录就返回一次数据库,显然是不切实际的,所以最佳的解决方法就是将从数据库中检索到的记录进行临时存储,然后再对该临时集进行使用,这就是数据集的概念。数据集其实是数据源检索到得记录的缓存,其工作方式好比虚拟的数据存储区。数据集里面的数据一般是数据库中内容的精简版本,可以采用和操作数据类似的方式对数据集进行操作,操作时数据集能够保持与数据库的不连接状态,从而使数据库可以自由执行其他任务。使用数据集最便利的地方在于组件能够按照需要交换数据集。因此,组件不必分别查询数据库。3.数据集独立于数据源。虽然数据集是从数据库中获取数据的缓存,但是两者之间却并没有任何实际啥关系。可以将数据集看作是一个容器,填充这个容器的主要内容是从数据适配器执行的SQL命令或存储过程。由于数据集并没有直接绑定在数据源上。因此,数据集则是来自于多个源的数据的集成点。
(二)ADO.NET数据访问技术的安全性研究。1.安全的ADO.NET连接。为了确保应用程序的安全,首要目标就是保护对数据源的访问,而要想保护对数据源的访问,就必须保持用户的密码、标识以及数据源名称等连接信息的私密性。应避免用纯文本的形式存储用户的密码和标识。因为这样做会造成严重的安全漏洞。用户的密码和标识属于源代码的一部分,如果源代码的安全受到威胁,那么用户的密码和标识则很容易遭受攻击,即便向外部源提供的代码是编译后的版本,也很有可能会被反汇编,从而导致用户的密码和标识被公开,所以说用户的密码和标识绝对不能用纯文本的形式存在于代码中。因此,在连接到Microsoft SQL Server时,可以使用集成安全性,这是因为集成安全性使用的是当前活动活动的标识,而不是传递用户的密码和标识。2.安全的ADO.NET编码。确保应用程序的安全还包括编写安全的代码,而代码则必须只公开客户端代码所需的信息和功能。通常在ADO.NET中最常见的攻击是SQL Insertion攻击,攻击者主要是通过在数据源位置插入其他的SQL语句来达到攻击的目的,这些命令不但能够破坏会修改数据源位置的信息,而且还可以检索用户的私人信息。为了防止SQL Insertion攻击,必须对来自外部源的输入进行验证,并传递列值作为参数,而不是串联这些值来创建SQL语句。
三、结论
总而言之,ADO.NET数据库访问技术具有不依赖于连续的活动连接、数据能够被缓存到数据集中和数据集独立于数据源等优点,必将得到广泛的应用。但在具体使用中必须对其安全性加以注意。只有在确保其安全的基础上,才能更好地发挥该技术的各种优点。
参考文献:
[1]吉占占.基于DataSet和ADO.NET的文献检索列表转换软件设计[J].计算机应用与软件,2009,6
[2]王丽芳.基于ADO.NET的O/R Mapping中间件的研究[N].西北工业大学学报,2010,6
数据仓库中数据存储与访问的实现 篇3
数据仓库的概念自出现后,首先被应用于金融、电信、保险等传统数据处理密集的行业。国外许多大型的数据仓库在1996-1997年建立。随着工业竞争的加剧,数据仓库已成为营销的必备武器----一种通过更多地了解客户需求而保住客户的途径。
1 数据仓库研究现状
OLAP (On-line Analytical Processing) 是面向特定问题的联机数据访问和分析,它主要用于支持目标明确但比较复杂的查询分析操作[1]。目前数据仓库数据存储的实现主要有三种模式,一是单纯的关系数据库存储即ROLAP (Relational OLAP) ,二是多维数据库存储即MOLAP (Multidimensional OLAP) ,三是关系数据库和多维数据库的混合型存储[2]。第三种模式在国内已经开始广泛应用,但还存在存储效率低,访问权限难以控制等问题。
目前,我国很多商业银行都尝试构建了应用于某一方面的数据仓库系统,数据仓库的构建几乎都是基于ROLAP来实现的,绝大多数是用Microsoft SQL Server完成的。对于汇总数据和历史数据的访问及访问速度的要求,还是有些欠缺。
2 一种高性能的技术--HOLAP
根据OLAP的自身特点,它主要就是对用户请求的快速响应和交互式的操作,多维分析则是OLAP的核心所在。OLAP系统在具体实现时首要解决的是如何存储数据的问题。数据的存储有三种方式,即ROLAP、MOLAP和HOLAP (Hybrid OLAP) ,HOLAP是对他们的良好折中。它得益于ROLAP较大的可伸缩性和MOLAP的快速计算。MOLAP的查询性能很好,它可以很好地解决对于历史数据和汇总的查询问题,它的分析能力很好,这正是数据仓库应用系统所应有的特点。MOLAP多数用于存储那些历史的、聚合的数据,当要查询一些细节数据时,就要选择ROLAP这样才能满足需求,更好地完成查询分析任务。
3 改进后的存储模式
在考虑到实际应用和用户需求的基础上,可以基于关系数据库和多维数据库共同来搭建企业级的数据仓库。实现的方法是把聚合的、历史的数据存储在多维上,明细数据存储在关系数据库中,各取所长,达到事半功倍的效果,基于这两种存储方式实现的即HOLAP。
与之前的应用模式不同的是数据平台的数据仓库是用关系数据库和多维数据库共同组建的。关系数据库选择了由IBM DB2 UDB完成,多维数据库则选择了Essbase/DB2 OLAP Server来完成。数据展现平台用Java实现,基于MVC设计模式实现,并将该平台分为Web层、服务层和数据访问层。由于要访问不同的数据库系统,所以要区别对待,访问关系数据库数据则采用开源的Ibatis框架,将各种SQL语句存放在配置文件中进行统一维护通过JdbcDao访问关系数据库;对于多维数据库数据, DB2 OLAP Server的多维数据集访问的脚本语言的接口也提供了Java接口,由于数据展现平台是用Java开发的,所以我们可以直接访问多维数据库。但是在实践过程中证明,通过这种方式访问多维数据库的速度是相当的慢,之后尝试使用我们最熟悉的C,采用Java原生接口来实现对多维数据库的访问,它是通过Essbase/DB2 OLAP Server的C接口访问多维库的。使用C后效果则截然不同,如果将采用Java访问多维库的系统称为原有系统,将采用C访问多维库的系统称为改进系统。
4 结束语
本文对于我国的数据仓库的应用模式提出了将历史的、聚合的数据存放在多维库中,将细节数据存放在关系库中的存储方式,并采用C接口访问多维数据库,采用Ibatis框架访问关系库的改进方案。改进后更适合于对汇总数据及历史数据的查询,并提高了数据访问速度。
摘要:从分析国内外的数据仓库应用现状入手, 指出银行在应用数据仓库过程中存在的存储效率低, 访问权限难以控制等问题。然后基于对数据存储的分类, 提出关系数据库和多维数据库混合存储的方法, 测试表明该系统达到节省存储空间和提高访问速度的效果。
关键词:数据仓库,商业银行,联机分析处理
参考文献
[1]颜石专, 李战怀.基于数据仓库和OLAP的商务决策系统[J].微电子学与计算机, 2006, 23 (2) :64-67.
数据访问模型的现状 篇4
许多计算机应用,包括计算密集型和IO密集型应用,都需要高性能的底层存储系统保障服务。面对应用系统产生大量数据的IO访问,存储系统需要提供足够的性能来保证应用的服务质量(quality of service,QoS)。随着基于虚拟化技术的云计算的发展,多用户、多应用的场景更加普遍,比如Amazon云,保障应用所需的性能尤为重要[1]。不同的应用具有不同的访问特性,应用内部也存在不同的数据访问阶段,因此,根据不同应用的数据访问特征分而治之,是存储系统必不可少的机制。
数据访问的特征分析,对于针对性的系统性能优化非常关键:①数据访问特征可以揭示某一类应用的规律性,从而为一类应用提供指导,比如缓存策略的指定[2,3]、数据布局[4]、程序重构[5]和程序行为分析[6,7,8]等等;②基于访问特征的数据预测,能够及时地、动态地优化系统的性能[2],也为应用的QoS提供了保障。
数据访问的分析,一般是通过收集应用访问trace记录,进行离线或近线分析得出应用的访问特征。这方面的研究工作主要以IO访问trace分析为热点,而典型的访问特征是访问的时度(Recency)、频度(Frequency)、重用距离(Reuse Distance)等统计特征。对于数据访问特征的分析,学术界进行了大量定性和定量的研究,提出了大量的模型,比如LRU堆栈模型(LRU Stack Model,LRUSM)[9],工作集(Working Set,WS)模型[10],有界局部性间隔(Bounded Locality Interval,BLI)模型[11],访问间隔模型(Inter-Reference Gap,IRG)[12],有效重用工作集(Generalized Effective Reuse Set Size,GERSS)树模型[4],稳定集模型(Stable Set Model,SSM)[2],相关集模型(Related Set Model,RSM)[13]。根据研究对象的粒度不同,本文将数据访问的研究分成两类:微观模型和宏观模型。
2 微观模型
应用程序(比如,数据库、搜素引擎、文件共享等)产生的数据访问请求,可以描述为一个请求序列,例如r1r2…rt…表示经过t个逻辑时间产生的访问序列,其r(i)表示第i个时间访问的数据对象。这里的逻辑时间,是指一次访问定为一次时间。数据对象的大小根据研究系统不同而不同。微观模型针对数据访问序列,研究的基本单位是一个数据访问请求r(i),考虑请求之间的时空局部性。时间局部性暗示一个数据被访问之后,在很短时间内会再次被访问;空间局部性暗示一个数据被访问之后的很短时间内地址相邻的数据会被访问。
2.1 简单随机模型
简单随机模型(Simple Stochastic Models,SSM)主要分为三种,简单重用模型(Simple Renewal Model,SRM)[14]、独立访问模型(Independent Reference Model,IRM)[15]和LRU堆栈模型。
简单重用模型SRM认为每一个数据的访问过程都是一个渐进独立的重复使用过程,这个模型曾经作为计算工作集的统计数据[16,17],但是在缓存管理方面并没有发现优势[17]。独立访问模型IRM认为每一个数据块都有自己的访问概率,而这个访问概率是一直不变的,即Pr{rt)=i}=aifor allt,也就是文献[18]中所提到的概率模型。独立访问模型IRM是LFU(Least Frequently Used)替换算法的理论基础。LRUSM起源于LRU(Least Recently Used)替换算法,LRU堆栈是一个按照访问时间距离当前时间远近排序的向量,向量的第一个位置是当前访问数据r(t),对应r(t)的堆栈距离d(t)是指r(t)元素在上一个时刻离栈顶的位置,如图1所示。
在上世纪六七十年代,简单随机模型的研究是很活跃的模型研究。当时研究者已经对局部性(locality)现象有了一定的认识,但是,由于错误的认为局部性之间的转换是一种类似缓慢漂移的行为,许多人认为采用简单随机模型也能模拟出这种局部性现象。然而,在使用简单随机模型进行工作集大小估计、缓存替换算法评估等工作时,研究者发现了许多与事实不符的现象,这直接否定了对局部性转换的“缓慢漂移”认知,并导致了复合模型的诞生[17]。
简单随机模型很容易部署到缓存管理中。该类算法利用数据访问中数据块的访问历史信息来评价是否需要替换该数据块。基本的评价指标有时度(Recency)和频度(Frequency)两种,两个指标分别对应于LRU和LFU两种算法。LRU算法是选择最近最少使用的数据进行替换,而LFU算法是选择访问频度最少的数据进行替换。LRU算法的理论基础是LRU堆栈模型(LRUSM),它根据每个数据块距离上一次访问的间距来衡量该数据块的热度,即访问间距越近的数据块的访问热度愈高,反之亦然。LFU则基于独立访问模型(IRM),它根据每个数据块的数据访问频度来衡量数据块的访问热度,访问频度越高的数据块的访问热度也就愈高,反之亦然。然而不管是LRUSM模型还是IRM模型都不够全面[19],因此现代的缓存替换算法一般都会把这两种评价指标综合在一起,例如ARC(Automatic Reference Counting)算法[19],该算法能够以在线自适应方式动态调节Recency和Frequency两种评价指标所占比例,以期适用于各种不同的数据访问类型。目前这类算法研究工作中有代表性的研究成果主要有:IRU、LRU-K[20]、2Q[21]、LFU、MQ[22]、LR-FU[23]、LIRS[24]和ARC。
2.2 IRG模型
访问间隔模型IRG[12]考虑对同一元素两次访问的时间间隔作为时间局部性的有效评价,IRG(a)=X1X2…,其中Xi=ti-ti-1,如图2所示。
IRG模型使用k阶马尔科夫(Markov)链来进行未来访问间隔预测,见公式(1)。
IRG模型能够根据相同的时间间隔来捕捉簇内局部性(Inter-cluster Locality),但是基于马尔科夫链的开销不利于实际应用,而且真实访问间隔的变化是不稳定的,对其预测效果是有影响的。基于IRG的内存替换算法,会选择预测时间间隔最长的数据进行替换,但是独立查看每一个数据块,无法获取捕捉应用整体上的访问行为。
综上所述,微观模型实现比较简单,如表1所示。最主要的应用就是缓存管理,基于微观模型的优点在于访问热度评价方法在实际应用中所带来在时间和空间上的开销较小。其中LRU算法又由于实现最为简单且对于不同数据访问模式类型具有较高的普适性,因此在对缓存处理时延要求较高或计算资源匮乏的应用环境下最为适用,例如CPU片上数据缓存、磁盘控制器中同步动态随机存储器(Synchronous Dynamic Random Access Memory,SDRAM)缓存等;但该类算法在管理大容量缓存的时候将遇到困难,由于它们采用LRU的渐变式访问概率估计方法来近似逼近突变的访问概率,在大容量缓存中,将不再访问的数据替换出缓存将需要花费更长的时间作为代价,这造成了更严重的缓存资源浪费。
此外,应用数学拟合曲线也可以直观描述数据访问特征。例如按照数据访问频度降序排列,互联网文本负载符合Zipf-like分[25],互联网的媒体负载的访问符合拉伸指数模型(Stretched Exponential,SE)[26]。
3 宏观模型
宏观模型与微观模型不同,宏观模型类似于经验模型,它来自于数据访问直观特征的假设。其研究对象是应用产生的数据访问集合。与单个请求相比,集合描述的数据更多,更能反映数据访问的阶段性,从而揭示应用的行为变化。
3.1 工作集模型
工作集模型[10]是最早的用于刻画应用缓存需求的理论。它最初主要是用于解决内存资源的抖动(thrashing)问题。工作集理论定义集合W(t,T),表示某一应用在t时刻之前的T间隔内的数据访问集合(如图3所示),然后根据集合中元素的个数定义应用的缓存需求。工作集模型的缺点是由于。与T的任意性,W(t,T)集合大小存在很大的任意性和不确定性,因此只能作为一个缓存需求的参考值。使用工作集模型,可以用来平衡资源需求和分配问题[27]。
3.2 阶段-转换模型
阶段-转换模型(Phase-Transition Model)起源于对虚拟内存中局部性(locality)突变现象的正确认识。阶段-转换模型认为,程序的访存行为可以表示为以下二元序列:
其中局部集Li是在第i个阶段内被访问的数据的集合,而Ti是该阶段的持续时间。程序在一个阶段内部的访问行为是稳定的或者缓慢变化的,而阶段和阶段之间的变化是突变式的。Denning和Kahn[28]设计了一个复合模型,用于验证突变转换的重要性,在这个模型中有一个宏观模型和微观模型。宏观模型是一个半马尔可夫链,它的状态是互不相交的局部集(Locality set),持续时间就是阶段时间。宏观模型用于产生一个(S,T)的二元序列,其中S表示局部集,T表示它的持续时间。微观模型用于产生一个在S集合上长度为T的访问序列。微观模型可以是IRM,LRUSM和循环访问。他们证明了突变转换是程序行为模型中不可忽略的
Batson和Madison[11]开始实验在真实的符号引用序列中学习阶段和转换。他们使用活跃集(Active set),并以此称谓表示局部集,并使用“有界局部间隔”(Bounded Locality Interval,BLI)来表示阶段和局部集的结合体,如图4所示。他们定义阶段是一个给定数据集合在LRU栈顶全部被重用后,继续停留在LRU栈顶的时间。这是对实际访问序列中的阶段和转换的第一次捕捉。但是他们的捕捉仅仅用于验证阶段和转换,在访问模型中具有同样的重要性,并没有用于实际指导缓存管理。阶段表明了应用所需的活跃数据的稳定性,而阶段转换暗示了应用行为变化导致了活跃数据的变化。一些技术提出了识别阶段的方法[29,30,31]。
此后还有很多的模型研究[17],他们共同验证了阶段和转换两种行为在程序行为中具有同等重要的地位,阶段-转换行为是对程序行为局部性的精确描述。
基于阶段-转换模型,研究者[32]可以在程序概要分析阶段对程序的访存行为进行刻画,并预测该程序之后的访存行为,从而优化缓存的管理,比如自适应调整CPU缓存,或者进行内存的重映射。
Majumdar等人指出应用对文件系统的访问模式与对虚拟内存的程序访问模式具有相似的locality特性,因此可以将对于程序的访问行为的研究大部分移植到对于文件系统访问模式的研究上[33]。研究[33]将BLI模型从程序访问模型里移植过来,用于分析文件系统上的访问行为。Majumdar的工作主要集中在对短期数据访问中存在的阶段-转换行为的研究。实验结果表明,文件访问序列呈现出与程序访问行为非常类似的“阶段-转换”行为,证明使用“阶段-转换”模型分析文件或者存储系统的访问是合理的。曾经的研究[34,35]对于长期数据访问行为的研究也发现了类似的阶段-转换现象,他们的研究主要应用于数据迁移。
3.3 RA模型
为了刻画访问关联的数据,文献[5]提出了访问紧密度(Reference Affinity,RA)。RA是指数据总是一起访问的程度,数据划分的依据是依赖不同数据之间的访问距离。依靠距离大小将数据分成不同的层次。
给定数据访问序列r1r2…rt…,另访问时刻i的数据为ri,访问时刻j的数据为ri,j>i,则ri和rj之间的堆栈距离dis(ri,rj)为访问时间[i,j-1]内访问的不同的元素个数,定义为容积距离(Volume Distance,VD)。如果ri和ri是对同一个数据的访问,那么VD就变为重用距离。如果rx和ry之间存在m个数据访问rxi,,…,,满足以下两个条件:①dis(ri,≤≤;②,ry都是对不同数据的访问。这样的链路定义为链接路径(Linked Path),其长度为k,组成一个RA组。不同的k将数据访问划分为不同的集合,而且由较小的k形成的RA组是较大的k’形成的RA组的子集。如图5所示。
基于RA模型的k-距离分析方法,可以提升程序数据布局一数组和结构重组的效率;访问紧密度为应用在不同内存层次的数据布局提供了一定的依据。
3.4 GERSS树模型
为了解决共享环境下不同层次缓存使用的问题,GERSS树模型[4]刻画了应用运行时在不同层次缓存的容量需求,对工作集模型进行了重新定义,提出了重用集(Reuse Set,RS)和有效重用集大小(Effective Reuse Set Size,ERSS)概念。ERSS是指保证应用在一个阶段内不发生thrashing的最小物理内存容量;ERSS是与缺失个数除以命中个数的比例ΔM相关的,表示为ERSS(ΔM)。
一个应用的GERSS树,是刻画了所有阶段的树形结构,其中每个阶段表示为一个树节点,每个节点包含持续时间θ(以逻辑时间表示)和有效重用集大小ERSS(ΔM)。节点之间的父子关系表示阶段的嵌套关系,一个节点可以有多个子阶段;如果一个子阶段发生许多次,边的权重表示发生次数,如图6所示。图6中,GERSS树包含5层阶段,最顶层阶段包含6×108次访问,包含两个小阶段,每个阶段16MB。第二层的阶段一个包含3.13×108次访问,一个包含2.57×108次访问。
GERSS树模型[4]主要用来规划应用在内存层次(memory hierarchy)的容量配置,当应用独立运行的时候,通过给定的缓存容量,根据缺失率信息识别出各个层次的阶段构造其GERSS树,根据不同层次的内存容量放置不同大小的阶段数据,其详细过程参照文献[4];当多个应用共享内存时,每个应用都有自己的GERSS树,所有应用在不同层次的阶段数据总和不超过该层的缓存容量,就不会影响各自的服务质量。
3.5 访问相关性模型
数据访问之间存在着一定的联系,称之为访问相关性。存在这种关系的数据总是会在某个阶段内一起访问或者一起不访问,表现出一定的稳定性。借助于工作集,令S代表该数据块集合,W(t,T)代表在(tT+1,t)时间内S集合中被访问数据块的子集。s是S集合中数据块的个数,w(t,T)是w(t,T)集合中的数据块个数。对于绝大多数时间点t,其形式化表达如公式(2)。
文献[2]针对访问相关性的特征,提出了一种新的数据访问模型一稳定集模型(SSM),该模型能够精确的描述阶段转换行为。SSM是一种基于局部性原则、描述长时间数据访问情况的模型。它通过挖掘数据块之间的关系获得访问概率突变的详细信息。它将数据访问描述为多个不相交的集合,每个集合被标记为在多个时间段中处于活跃状态,一个时间段中可以有多个不同的集合同时处于活跃态。一个集合中的数据块倾向于同时被访问或同时不被访问。这种稳定集现象在一些trace中普遍存在,而且该现象可以直观的使用局部性原则来解释。
文献[36]描述了程序访问局部性的图像,如图7所示,纵轴是物理地址块号,横轴是时间。块号和时间间隔增大到一定程度之后,我们可以看到一些数据块总是倾向于同时被访问或者同时不被访问。
图8是将图7所示数据访问使用稳定集模型转化之后的效果,除了明显的阶段划分,在地址空间上也进行了划分。稳定集模型精确的刻画了数据访问的阶段-转换行为。稳定集模型SSM将任何数据访问流分解为有限个稳定集上的同时访问流,如公式(3)所示。
注:随着时间变化,局部性呈现明显的阶段性和聚集性
其中,(Si,Ti)表示稳定集Si上的访问流。访问流阶段性地同时访问Si上的所有元素,并且与其他稳定集上的访问流相互独立。Si是这个访问流访问的数据集,并且与其他稳定集是不相交的。Ti表示稳定集访问流(Si,Ti)发生的时间段序列,如公式(4)所示。
稳定集模型,是第1次存储系统访问行为研究。稳定集模型借助于工作集和阶段-转换的概念,实现了主阶段工作集的更小划分。其提出的稳定访问集概念,是在工作集的基础上强调了重复访问特性,与GERSS树模型的重用工作集概念相同。基于稳定集模型的缓存管理方法对于大数据集的阶段间缺失问题具有良好的优化效果,能显著降低服务器端负载,提高客户端访问速度[2,3]。
为了研究阶段的嵌套行为,已有研究[13]对SSM进行扩展,提出了相关集模型RSM。RSM把数据访问流R转换为不同层次相关集上数据访问的模型,如公式(5)所示。
其中,k代表层次,k越大代表细分的集合越小,R代表数据访问流,它可以表示为不同层次上访问流()的叠加。
第j层对应于每个相关集的活跃时间,是一个由不相交的时间段组成的集合{},在这些时间段里,相关集都处于活跃状态,即总是一起访问(访问相关性)。
同时,不同层次的相关集之间存在着“嵌套”关系:
(1)集合空间嵌套(数据包含):
(2)时间嵌套(时间包含)
其中,()为第j层访问流。
我们以文献[11]中访问请求序列为例,介绍嵌套关系,如图9所示。横轴刻度代表请求访问的逻辑时间。
从图9中可以看出时间和空间都满足嵌套的关系:从时刻11到30是集合{ABCD}反复访问的大阶段,从时刻13到20是集合{CD}反复访问的中阶段,时刻14到16是{D}反复访问的小阶段。此外,也能看出{CD}和{D}的重复出现的特征。
与稳定集模型相比,相关集模型对数据的嵌套特性进行分析,并认为访问相关性具有嵌套特性,是一种普遍存在的数据访问现象,是对数据访问的一种合理描述。
综合上还的模型,宏观模型所表达的集合属性强调了数据的聚类效应,对数据分布、行为描述非常关键,如表2所示。如何有效划分阶段和数据,保证活跃的数据总是在一起,是需要重点解决的问题。
数据访问的阶段性具有重要的意义:应用的访问呈现阶段性,具有两个属性,一是阶段的持续时间,二是阶段的大小;持续时间越长,性能越稳定,越容易保障应用的服务质量;阶段的数据越小,所需要的资源就越少[13]。数据访问的相关性为阶段的划分提供了重要的依据。
4 结束语
异步数据访问 篇5
软件开发中,数据库往往是信息系统的基石,即便是最简单的信息系统中都会涉及到数据的持久性和数据的访问。而JAVA作为一种可以撰写跨平台应用软件的面向对象的程序设计语言,被广泛的应用与当前的各种信息系统开发。但对于用Delphi及.Net开发过应用系统的开发人员大多都使用过数据集组件来连接数据库并操作数据库表数据的功能。这些功能使用很方便,同时有强大的数据操纵能力,可以对各种数据库进行统一操纵,数据组件会根据不同数据库的语法要求自动生成新增(insert)、修改(update)及删除(delete)等DML语句对数据库记录进行操纵。在JAVA环境中没有与之对应的数据集组件,JAVA主要依靠JDBC接口[1]来操作数据库数据,但JDBC属于一个较低层次的接口,虽然功能强大但需要较多的编程量,所以使用并不方便。有些JAVA持久层框架[2(]如Hibernate)基于JDBC做了一些包装并提出了OR映射的概念,通过操作对象的方式间接操作关系数据库中的记录,由OR映射框架自动将对象的新增、修改、删除等操作自动转换成特定关系数据库的DML语句。这种方式在JAVA世界中应用很多。但OR映射需要许多手工配置,且在涉及大数据量且表间关系复杂的情况时容易出现性能问题。并且对习惯SQL及数据集操作的程序员来说,对于对象的操作不如对记录行的操作直接和灵活。针对这些框架的问题,IBM和BEA设计了SDO(Service Da-ta Object)[3],方便了数据访问和操作。该文借鉴了SDO的方法及Delphi、.Net数据集的设计理念[4-7],应用软件设计模式方法[8-9],结合实际的开发经验,设计一种基于JDBC的JAVA通用数据集数据访问框架。
2 总体设计
整个框架设计的目标包括:
1)通用性,实现一种通用的关系数据库访问机制,能够独立于数据库,采用一致的数据集的方式访问及操作各种关系数据库。
2) 方便性,充分利用数据库的元数据功能,无需配置就能根据数据集的状态,自动生成某种数据库的DML语句,尽量减少编程量。
3) 扩展性,能支持现存或未来出现的各种关系数据库系统。
设计思路:
为达到以上设计目标,考虑将通用数据集框架主要分为2个大的部分来实现:
第一部分是独立于数据库的,这一部分里,所有操作的实现对数据库来说是完全中立的,无需考虑数据库的差异性;
第二部分是数据库相关的,这一部分里,所有操作的实现都要考虑特定数据库的差异,并通过接口及抽象类使这种差异对第一部分屏蔽。
3 独立于数据库的部分设计
独立于数据库的部分主要是数据表(Data Table)对象,其中包括数据列管理器(Data Columns)、数据列(Data Column)、数据行管理器(Data Rows)、数据行(Data Row)、数据字段(Data Field)等对象。对于开发应用开发者来说,主要是对这些部分的对象进行操作。以下对这些对象的功能进行介绍。
3.1 数据表对象(Data Table)
Data Table数据表,实现IData Table接口,负责在内存中保持及操作数据集,并自动记录数据集及记录行的状态等信息。
IData Table接口定义如下:
数据表(Data Table)对象主要依靠所包含的数据列管理器(Data Columns)、数据列(Data Column)、数据行管理器(Data Rows)、数据行(Data Row)、数据字段(Data Field)等对象来实现数据集的操纵功能。
3.2 数据列管理器对象(Data Columns)
数据列管理器对象(Data Columns)实现接口IData Columns接口,是管理数据列对象(Data Column)的容器。
IData Columns接口定义如下:
3.3 数据列对象(Data Column)
数据列对象(Data Column)实现接口IData Column接口,主要记录表字段的属性信息。
IData Column接口定义如下:
3.4 数据行管理器对象(Data Rows)
数据行管理器对象(Data Rows)实现接口IData Rows接口,是管理数据行对象(Data Row)的容器。
IData Rows接口定义如下:
3.5 数据行对象(Data Row)
数据行对象(Data Row)实现接口IData Row接口,主要用于管理记录行。
IData Row接口定义如下:
3.6 数据字段对象(Data Field)
数据字段对象(Data Field)实现接口IData Filed接口,主要用于管理数据字段。
IData Filed接口定义如下:
public interface IData Field {public IData Table get Table();public IData Row get Row();public IData Column get Column();public Object get Value() throws Exception;public void set Value(Object value) throws Exception;public boolean is Null() throws Exception;public boolean is Empty() throws Exception;public boolean is Change() throws Exception;}
4 数据库相关的部分设计
数据库相关的部分主要包括数据源(Data Source)、元数据(Meta Data)、数据适配器(Data Adapter)及命令生成器(Data Command)三个对象。以下对这些对象的功能进行简要介绍。
4.1 数据源对象(Data Source)
数据源对象需实现接口IData Source,主要封装了JDBC中的数据库连接对象(Connection)。负责连接到数据库,提供数据库级别的事务控制,并根据数据库的类型创建元数据(Meta Data)对象、数据适配器(Data Adapter)对象及命令生成器(Data Command)对象。
接口IData Source定义如下:
IData Source接口最主要的目的就是管理数据库连接及本地事务控制。各类数据库都应实现该接口,在现实中一般会提供一个实现IData Source接口的抽象类Data Source,该类将实现一些数据源对象的公共操作,然后特定数据库的数据源类则继承Data-Source抽象类,并实现其特定的功能。如:Oracle的数据源类Oracle Data Source,Sql Server的数据源类Sql Server Data Source等。
4.2 元数据对象(Meta Dat)
段、视图、存储过程、触发器等)。元数据对象,实现IMeta Data接口,负责提供统一格式的数据库元数据。可由此对象获取当前数据库中的所有对象(如:表、字
IMeta Data接口定义如下:
接口最主要的目的就是获取表及其字段的信息,表各类数据库都需实现这个接口。在现实中一般会提供一个实现IMeta Data接口的抽象类Meta Data,该类将实现一些元数据的公共操作,然后特定数据库的元数据类则继承Meta Data抽象类,并实现其特定的功能。如:Oracle的元数据类Oracle Meta Data,Sql Server的元数据类Sql Server Meta Data等。
4.3 数据适配器对象(Data Adapter)
数据适配器对象,实现IData Adapter接口。特定于某种数据库,负责实现对数据库的读写操作,能够从数据库加载数据到数据表,以及执行DML语句,将数据的变化写入数据库。
IData Adapter接口定义如下:public interface IData Adapter {
IData Adapter接口最主要的目的就是实现对数据库的读写操做,表各类数据库都需实现这个接口。在现实中一般会提供一个实现IData Adapter接口的抽象类Data Adapter,该类将实现一些数据适配器对象的公共操作,然后特定数据库的数据适配器类则继承Data Adapter抽象类,并实现其特定的功能。如:Oracle的数据适配器类Oracle Data Adapter,Sql Server的数据适配器类Sql Server-Data Adapter等。
程序员一般不需直接使用数据适配器对象,在Data Table对象需要加载数据(如调用open Sql方法)或写入数据(如调用execute方法)时,Data Table内部会使用Data Adapter对象来读写数据,并将数据填充到Data Table对象中,同时更新数据的状态。
4.4 命令生成器对象(Data Command)
命令生成器对象,实现IData Command接口。特定于某种数据库,根据数据表的变化状态生成DML语句。
IData Command接口定义如下:
IData Command接口最主要的目的就是生成更新数据所需的SQL语句,主要是Insert、update、delete语句。各类数据库都需实现这个接口。在现实中一般会提供一个实现IData Command接口的抽象类Data Command,该类将实现一些命令生成器对象的公共操作,然后特定数据库的命令生成器类则继承Data Command抽象类,并实现其特定的功能。如:Oracle的命令生成器类Oracle Data-Command,Sql Server的命令生成器类Sql Server Data Command等。
程序员一般不会直接使用命令生成器对象,在Data Table对象中的数据新增、修改、删除后,在调用Data Table对象的执行方法时,Data Table内部会使用Data Command对象来自动生成SQL语句。
5 使用样例
在java环境下,使用本框架来访问关系数据库,本身无需任何配置。只需在J2EE应用服务器上配置好JDBC数据源,使用标准的SQL语言即可访问任何数据,更新数据时无需拼凑SQL语句。如下所示,程序员只需在服务器上配好JDBC数据源,使用该配置的jndi Name即可操纵数据。
IData Source ds = Oracle Data Source“(jndi Name”);//创建一个Oracle数据源
ds.open(false);//打开数据源,并设置为不自动提交事务
try {
摘要:考虑使用数据集组件来连接数据库并操作数据库表中数据在软件开发中的方便性,其具有强大的数据操作能力,在很多开发环境中都提供了相应的数据集组件,但在JAVA语言的开发环境中没有与之对应的数据集组件,一般采用JDBC接口或者OR映射的方式完成数据的操作,其中JDBC接口因其属于较低层次接口需要大量的编程,而OR映射在涉及复杂数据关系及大量数据访问是容易出现性能问题,在借鉴其他环境中数据集的设计理念的基础上,以实际开发要求为目标,设计一种基于JDBC封装的JAVA通用数据集数据访问框架。
安全访问外包数据的研究 篇6
1 相关研究
参考文献[1]提出最有效的隐藏访问模式是采用分层结构算法。在分层结构算法中,如果洗牌算法采用AKS网络排序[3]算法,则平均时间复杂度为O(clog4N),其常数项c大约为6 000。当采用巴切排序网络算法[4]时平均时间复杂度为O(clog4N),其常数项c大小较为合理[5]。
许多学者在参考文献[1]的基础上又提出了一些新的结构[5,6,7,8,9]。其中参考文献[5,6]在平均时间复杂度方面进行了深入的研究。若客户端存储容量为O(1)时,参考文献[5]得到的平均时间复杂度为O(log2N),但一些研究人员已经发现参考文献[5]所提的结构存在安全问题[6]。在参考文献[6]所提出的结构中,当客户端存储量为O(1时,获得最好的平均时间复杂度为O(log2N);若客户端存储容量为时,可获得的平均时间复杂度O(log N)。参考文献[7,8,9]在最坏时间复杂度方面做了研究。参考文献[7]得出最坏时间复杂度为,但其平均时间复杂度也是。参考文献[8]提出一种新的O-RAM结构,当客户提供存储空间时,其平均时间复杂度为O(log2N),最坏时间复杂度为。参考文献[9的最坏时间复杂度为O(log3N)。
以上所提算法均由两个阶段构成,即访问阶段和洗牌阶段,算法的瓶颈就在洗牌阶段。在洗牌时,客户与服务器之间需要进行大量的数据交换,使得客户无法忍受洗牌过程占用的大量时间。如果能把洗牌过程分解到每次访问操作中,对服务器的访问时间保持在常数量级,这样就能将理论应用于实践中。因此,本文提出一种新的结构,在需要少量客户端存储空间和线性级服务器存储容量的情况下,使得每次操作的代价为O(1)。典型算法的性能比较[9]如表1所示。
2 常量级访问模式
本文假设客户端可信而服务器端不可信。O-RAM的目标就是对服务器完全隐藏数据访问模式,即从服务器角度观察,客户端每次读或写数据块请求将产生一个完全随机的数据访问序列。
2.1 数据结构
假设客户的数据大小为N块,每块大小为L字节,在云存储中,L的典型值一般为64 KB~256 KB。本方案需要占用服务器存储容量为3N块,利用均匀随机函数将N个数据块均匀随机地分布到3N个存储块中,其余2N个存储块存放哑元块。
在客户端设置一个缓存队列Q、两张数据表SerMap和PosMap。
缓存队列Q用来管理从服务器读取的数据块,本文假定最多可存储32个数据块。对缓存队列的操作有:Q.in(b)将数据块b插入队尾;Q.out()从队首移出数据块;Q.remove(b)将数据块b从缓存队列中移出;Q.getLen()返回缓存队列中存放的数据块数;Q.getSit(b)返回数据块b在缓存队列中的位置;Q.getSitF()返回队首数据块的块号。
Ser Map[3N]用来表示存储在服务器上各数据块的存储位置,它有3个域,分别是FlData、FlAcc和Fresh。FlData表示存储类型,其值为1表示该块为数据块,否则为哑元块;FlAcc表示其对应的存储块最近是否被访问过。当读/写存储块后,该变量的值设置为1。在查找一个哑元块时,若其值为0则选中该块,若其值为1则改为0,继续查找下一个哑元块;Fresh表示服务器存储块的新鲜度,在对服务器的每次读操作后都会使该变量的值增1,以保证相同数据在加密后结果不一样。
PosMap[N]用来表示用户数据块在服务器中存放的位置映射,包括flag和blockAdd两个域。flag表示数据块存放在服务器/本地的标志,若其值为1时,则表示数据块存放在服务器端,否则存放在Q中;blockAdd指数据块在Ser Map/Q中的位置。
2.2 访问模式
定义1:设客户对服务器的操作为(op,u,data),其中,op表示read(u)或者write(u,data)操作,u表示将要读或写的数据块标识,data表示要写的数据块。
无论op是读操作还是写操作,其访问服务器的序列由Lookup算法决定。
2.2.1 Lookup算法
在该算法中第1行和第7行共读服务器6次,其中随机读取2个数据块和4个哑元块,需要把所读的数据块保存在Q中。第2行至第6行读取指定的数据块u并保存在Q中。如果数据块u已在Q中,则随机读一哑元块。根据程序局部性原理可知,最近访问的数据块在最近的将来仍有可能再被访问到,因此对Q的管理并不按照严格意义上的先进先出策略,而是当访问的数据块在Q中时,将该块从Q中移出并放到队尾,以保证从Q中踢出的数据块是不常用的数据块。
当op是写操作时,将要写的内容覆盖Q中保存数据块u的缓冲区(第9行)。在每一次Lookup调用中,不停地有数据块存入Q中,Q总会变满,因此需要定期将Q中的数据块写入服务器以防止Q溢出,第10行是调用Evict将Q中的最久未用的数据块写入服务器。
2.2.2 Evict算法
Q中最多可存放32个数据块,调用一次Lookup最多有3个数据块进入Q中。因此,在Evict算法中,当Q的长度超过29时,则将超出的数据块写入服务器以保证Q在下一次Lookup操作时不会溢出。Evict算法描述如下:
第1行至第5行将数据块写入服务器。Evict踢出算法每次写6次服务器,先将缓存队列中的数据块写入服务器,然后用哑元块补足6块(第6行至第7行)。
2.3 洗牌
每执行一次Lookup都会将任意两个数据块读入Q中,当Q长度超过29时,就将超出的数据块写到服务器端的任意位置,实现洗牌操作,这样可将整个洗牌操作分摊到每次Lookup中,避免了集中洗牌造成的突发访问。
2.4 性能
假定存储块大小为64 KB,参考文献[9]与本文性能对比如表2所示。当数据文件小于等于16 TB时,所用客户存储空间小于参考文献[9],当数据文件大于16 TB时,所需客户存储量超过参考文献[9]。本文算法的优势在于所需服务器存储空间较少,实际性能恒定。参考文献[9]采用集中洗牌,当洗牌时需要大量的数据交换,当客户在读写操作时,若正好遇上洗牌操作,则需要等待很长时间。
2.5 安全
定义2:设y=((op1,u1,data1),(op2,u2,data2),…,(opM,uM,dataM))是客户请求访问数据块的一个序列,其长度为M。设A(y)表示存取访问模式,当客户的请求序列是y时,用A(y)表示存取访问服务器的序列。如果对于任何两个客户访问序列y和y′,只要其长度相等,对任何人(除客户本人)来说A(y)和A(y′)都是计算上不可区分的,则称该O-RAM结构是安全的。
在Lookup中,数据块u在服务器上的存储位置是随机分布的,读取u和6次随机读数据块操作混在一起,攻击者很难猜到哪一块是真实的块,并且攻击者很难知道下一次它将存放在哪一个位置。
在访问服务器的过程中可能出现刚被淘汰出的数据块又要被访问的情况。这种情况下,攻击者仍然无法获取有用的信息,因为至少有2/3的数据块是随机选取读到Q中的,最多有1/3的数据块是客户所读的数据块,但Evict算法采用最久未用块淘汰策略,攻击者无法知道所读的块是否为所需的数据块,也无法知道什么时间该块会写入服务器,即攻击者从被踢出后又要被访问的数据块中无法获取有用的信息,因此系统是安全的。
本文提出的常量级访问模式仅需占用线性级服务器存储量就可实现无关访问服务器,但它需要占用客户端存储空间,当文件长度超过16 TB时,比参考文献[9]的算法占用更大的客户端存储空间。下一步工作将在减少占用客户端存储空间方面进行研究,找到一个需求客户空间更少的算法。
摘要:在存储外包应用中,无关RAM允许客户对不信任服务器隐藏数据存储模式。提出一种新的无关RAM结构,对客户的每个请求仅需常量级代价和少量客户端存储空间即可实现无关访问。
关键词:无关RAM,访问模式,数据外包
参考文献
[1]GOLDREICH O,OSTROVSKY R.Software protection andsimulation on oblivious RAMs[J].Journal of the ACM,1996,43(3):431-473.
[2]GOLDREICH O.Towards a theory of software protection andsimulation by oblivious RAMs[C].New York:STOC,1987.
[3]AJTAI M,KOLMOS J,SZEMEREDI E.An O(nlogn)sortingnetwork[C].Boston:STOC,1983.
[4]BATCHER K.Sorting networks and their applications[C].NJ:AFIPS Spring Joint Computing Conference.1968.
[5]PINKAS B,REINMAN T.Oblivious ram revisited[C].California:CRYPTO.2010.
[6]GOODRICH M T,MITZENMACHER M.Privacy-preserving access of outsourceddata via oblivious ram simulation[J].Automata,Languagesand Programming,2011(6756):576-587.
[7]BONEH D,MAZIERES D,POPA R A.Remote oblivious storage:Makingoblivious ram practical[EB/OL].[2011-3-30].http://dspace.mit.edu/bitstream/handle/1721.1/62006/MIT-CSAIL-TR-2011-018.pdf.
[8]STEFANOV E,SHI E,SONG D.Towards practical obliviousram[C].California:NDSS,2012.
数据访问中间件研究 篇7
随着计算机技术的飞速发展,各种各样的应用软件需要在各种平台之间进行移植,或者一个平台需要支持多种应用软件和管理多种应用系统。软、硬件平台和应用系统之间需要可靠和高效的数据传递或转换,使系统的协同性得以保证。
为了解决分布异构问题,人们提出了中间件(Middleware)的概念。根据著名咨询机构IDC对中间件的分类,中间件包括终端仿真/屏幕转换中间件、数据访问中间件、远程过程调用中间件、消息中间件、交易中间件、对象中间件6大类,而在这几种产品中,数据访问中间件(Data Access Middleware)是随着数据库技术的发展而逐渐兴起的,也是其中发展较早的一类。
对于企业和政府机构来说,拥有很多种类的数据库和数据资源是一种普遍情况,而这些单位又通常需要把所有数据综合利用,以提供对业务的支撑。这个时候,数据访问中间件的作用就会凸现出来。数据访问中间件能够实现对各类数据资源(主要是关系型、复合文档型及对象型)的管理,支持对数据的高级集成,提供统一的访问接口支持对数据集的访问。因此,只要多种类型的数据资源环境存在,数据访问中间件将会一直发挥重要作用。
1 研究工作
数据访问中间件位于客户机服务器的操作系统之上,通过使用同一接口提供对运行在多种平台上的不同数据库的访问。通过使用数据访问中间件,一方面可以解决数据使用的不一致,实现数据的统一管理;另一方面,数据结构的改动,可以最大限度不影响上层应用系统,极大地减少了系统维护的难度,实现数据库对客户访问的完全透明。
数据访问类中间件是在分布式系统中建立数据应用资源互操作的模式,实现异构环境下的数据库连接或文件系统连接的中间件,从而为在网络上虚拟缓冲存取、格式转换、解压等带来方便。该类中间件主要解决以下几个方面的问题:
① 解决管理数据库连接,抽象网络协议。一般由数据库厂商或支持多数据库的中间件提供;
② 支持对数据库存取的编程,可以使用存储过程。对象数据库常为面向对象编程语言如Java/C++提供适应ODMG的接口;
③ 用于数据复制、转换、信息增值。常作为数据仓库解决方案的一部分;
④ 注重对数据的结构进行操作而不是数据本身,读写数据库的分类信息。
数据访问类中间件主要适用于应用程序与数据源之间的互操作模型,客户端使用面向数据库的API以提请直接访问和更新基于服务器的数据源,数据源可以是关系型、非关系型和对象型。这类中间件大都基于SQL语句,并采用同步通讯方式。
2 实现机制
数据访问中间件用于处理业务服务层和数据层之间的交互操作,目的是将用户和数据访问的复杂性相隔离。数据访问中间件设计的主要特点是将与数据库的连接和访问有效地进行管理。通过对数据连接和访问机制的管理,改善网络上多用户访问数据库的性能,优化网络传输,并支持与多种数据库的连接。
2.1 客户端/服务器机制
数据访问中间件主要由服务端和客户端两大部件组成。服务端是数据访问中间件的核心,是连接客户端和数据服务器的中枢,同时具备在本地数据库服务器无法提供服务的情况下,与其他服务端交互的功能;具备判断负载能力,实现多个服务端的负载均衡;实时接收来自客户端的数据请求,并将执行结果反馈给客户端。
客户端以COM组件的形式提供给客户应用程序,客户应用程序通过客户端,根据预先约定的数据访问协议向服务端发送数据访问请求,数据的访问结果由客户端进行解析并以通俗明了的表达方式提供给客户应用程序,方便其使用。数据访问中间件结构如图1所示。
2.2 通用数据访问协议
为了解决应用程序和数据库结构的紧耦合关系,数据访问中间件采取方便用户访问数据的简单通用数据访问协议。
数据访问中间件通过使用同一接口提供对运行在多种平台上的不同数据库的访问,提供给使用者到任意数目数据库的访问接口,包括一些运行在典型的不易访问的环境下的数据库。SQL调用解释成为标准FAP(Format and Protocol)格式。FAP格式通用的客户机和服务器连接,也是异质数据库和运行平台的通用连接。把API调用直接翻译成FAP,把请求传递到目标数据库并翻译以便目标数据库和平台做出响应。
2.3 数据库访问接口
数据访问中间件可支持访问MS SQL SERVER、SYBASE、ORACLE、DB2常见流行的中大型数据库。虽然在Windows平台下有着很多通用的数据库访问接口,如ODBC、ADO、DAO和BDE等。但是考虑到数据访问中间件的跨平台可移植性,比如把在Windows平台下开发的数据访问中间件移植到UNIX平台下,如果开始设计开发采用了ODBC、ADO、DAO和BDE这些数据库访问接口的话,那么移植起来就会要全部推倒重来,移植性非常差。基于这点考虑,在设计数据访问中间件时采用自己封装的接口(即数据库访问接口)。对于访问MS SQL SERVER和SYBASE来说,它们自带有DBLIB接口;对于访问ORACLE来说,它自带有OCI接口;对于访问DB2来说,它自带有CLI接口。DBLIB、OCI、CLI这些接口的API函数功能大致相似,因此,通过封装就可以得到一个具有跨平台可以移植的、通用的数据库访问接口。通过这个接口,在数据访问中间件中统一向数据库建立连接、发送SQL请求、返回数据。
2.4 负载均衡
定时器实时检测数据访问中间件服务器的负载情况,依据负载均衡计算规则将客户请求队列的请求转发给特定的服务器请求队列。
3 关键技术
3.1 元数据的构建
所谓元数据,就是“描述数据的数据”或者“描述信息的信息”。数据和元数据的划分不是绝对的,有些数据即可以作为数据处理,也可以作为元数据处理。
元数据库资源可以理解为数据访问中间件进行分布式访问所需要的信息。在一个通常的数据访问中间件中,这些信息主要是对于数据库和数据库中的表的描述。
随着信息技术的发展,尤其是计算机网络技术的出现,数据的管理和使用已经从集中式转变为分布式,在新的系统环境中,为适应对分布在多个网络节点上的、多种内容、多种类型的数据库的管理和使用,促进数据共享,通过建立不同等级的、与数据库实体链接的元数据库,可以规范数据管理,使数据具有继承性,达到管理数据、说明数据、了解数据和获取数据的目的,从而使信息共享成为可能。
3.2 数据库连接池技术
数据库连接池的功能主要是提供一套对数据库物理连接的分配和使用策略,最终实现连接的高效、安全复用。
数据访问中间件的重要功能就是根据用户请求,对数据库进行操作,然后将结果返回给用户。频繁的建立和关闭数据库连接是非常耗时的。因为建立一个数据库物理连接,数据库服务器要进行一系列的动作,它们分别是建立连接、检验有效性、检查权限、分配私有缓冲区等。在断开这个连接时,服务器要做许多后续工作,如释放缓冲区、释放连接所用的许多资源。为了解决这个问题,数据访问中间件系统在数据库的连接中应用连接池的实现技术。这对于改善整个系统的性能,特别是数据访问中间件的性能而言,是非常重要的。
对于资源共享,有一个很著名的设计模式—资源池。该设计模式主要是为了解决共享资源频繁分配、释放所造成的问题。将该设计模式应用到数据库连接管理领域,就是数据库连接池。其原理就是建立一个管理所有数据库连接的连接池,用户访问数据库时从数据库连接池取得连接,执行数据库操作,然后释放这个连接,但连接池并不关闭这个连接,而是把该连接置为空闲状态并放回连接池,继续提供给其他的客户使用。
数据库连接池是一个存放数据库连接的缓冲区,由一个监视线程维护。在系统初始化时,根据配置,在连接池中预先建立一定数量的数据库连接,以后所使用的连接都从该连接池中获取。连接池建立之后,需要定义一套分配和释放连接的策略。当用户请求数据库连接时,首先看连接池中是否有空闲的连接,如果有空闲连接则将连接分配给用户,并做相应处理。主要处理策略就是设置该连接为已分配状态;若连接池中没有空闲连接,则先看该连接池是否已达最大连接数,若未达到则创建新连接并设置其为已分配状态即可,若已达到则只能等待其他线程释放连接后再获取,超过允许的最大等待时间则此次请求无效。当用户释放数据库连接时,就放入到连接池中,并设置其为空闲状态,而不是关闭。正是这种策略,保证了数据库的有效复用。另外,针对数据库连接池中到底要放置多少个连接,连接用完后该如何处理的问题,需要一套配置策略,根据具体的应用需求,确定一个初始的连接池中连接的数目以及一个连接池可以建立的最大连接数目。
4 结束语
数据访问中间件技术在降低开发成本、提高工作效率上起着独特的作用。但是大多数数据访问中间件都是把数据访问的部分封装起来,真正适应性强的数据访问中间件并不多。因此,构建适应性强的数据访问中间件将是数据访问中间件技术未来发展的一大方向。
大型数据库系统在企业级信息应用中正扮演着日益重要的角色。随着分布式应用的发展,数据库上的信息流量迅速增长,以至于服务器极容易在某个小的时间段内超负荷,尤其是现有的Web服务器以及各种应用服务器。数据访问中间件则能够在解决上述问题上发挥很好的作用。
本文针对数据访问中间件的重要性,对数据访问中间件的研究工作、实现机制及关键技术进行了详细论述,并对其未来的发展方向进行了展望。
摘要:数据访问中间件是在分布式系统中建立数据应用资源互操作的模式,实现异构环境下的数据库连接或文件系统连接的中间件,该类中间件在所有中间件中是应用最广泛、技术最成熟的一种。全面而系统地介绍了数据访问中间件的研究工作、实现机制及关键技术。对数据访问中间件进行了展望,指出了数据访问中间件的未来发展方向。
关键词:中间件,数据访问中间件,客户端/服务器
参考文献
[1]洪志全,徐琳.分布式数据服务中间件实现技术研究[J].计算机应用研究,2003,12(1):46-48.
[2]李翠,蒙科知,张露.反射式中间件研究[J].软件导刊,2008,7(4):3-4.
[3]SCHMIDTD.Towards Adaptive and Reflective Middleware for Network-centric Combat Systems[J].Crosstalk,2001,16(2):42-45.
[4]李敏,周园春,李淼,等.基于DCOM的领域数据访问中间件的研究与实现[J].计算机应用研究,2004,6(2):130-131.