张志强, 郑 涛, 王伟钧,杨晋浩
(成都大学 信息科学与工程学院,四川 成都 610106)
目前,在证券公司的数据交易系统中,其数据查询是系统非常重要的功能之一.同时,由于证券交易系统的数据量往往非常庞大,因此,提高查询效率是数据查询功能模块设计的关键[1].针对不同环境下的数据访问接口,科研人员进行了相关的研究与设计,并取得了一系列成果[2-8],但针对证券数据交易系统的数据查询访问接口的研究和设计很少.对此,本研究采用分层化策略来设计数据访问接口,在客户端层与服务器端数据层之间设计数据访问接口的中间层实现数据查询流程,通过该数据访问接口的实现,使得查询过程具有分层化查询、查询数据精简化获取等特点,从而提高了数据查询的效率.
本研究数据访问接口的体系架构如图1所示.
图1数据访问接口的体系架构
如图1所示,本数据访问接口实现了客户端层和服务器端数据层之间的中间层设计.通过该中间层,当客户端利用浏览器请求查询时,查询参数以get请求方式通过浏览器地址进行传递,数据访问接口接收查询参数.在数据访问接口中,通过存储过程调用接口将查询参数传递到服务器端数据层的存储过程进行数据查询,查询结果返回到存储过程调用接口.为了向客户端浏览器返回精简的查询数据结果,数据访问接口在接收到查询结果数据后,需要进行后期处理,其先将查询结果数据通过对象数据封装模块封装到数据对象中,然后再通过JSON封装模块将数据对象以JSON数据格式进行封装并产生JSON字符串,最后将JSON字符串返回到客户端浏览器,从而实现精简的查询数据结果.在后期,客户端浏览器接收了JSON数据后,进行前端解析,并最终将查询数据在Web端或移动端浏览器以设定的样式进行显示.这种分层化的设计可以使数据查询压力分散在不同的地方.
为了实现数据访问接口的通用性参数控制,本研究将数据库服务器连接和登录信息参数存储在配置参数文件中.其配置参数文件的内容格式说明如表1所示.同时,多个配置参数以XML格式存储在文件中,其存储结构形式如图2所示.
表1 配置参数文件的格式说明
图2参数配置文件的存储形式
在数据访问接口中,首先利用DOM接口进行配置参数文件的读取操作,然后根据读取的参数值实现数据库服务器的连接和登录.由此可见,通过动态修改配置参数文件内容的方式,可以使得数据访问接口具有动态设置权限账户连接和登录数据库服务器的通用能力.此外,对配置参数文件的内容进行修改后,将参数配置文件的路径地址作为参数传递到配置参数读取程序,从而完成配置参数的读取.
通常,在证券数据交易系统中,数据表的数据量非常大,而且查询数据往往来自多个表的关联,如果在Web服务器中执行查询操作会给Web服务器带来较大的压力.为了降低Web服务器的压力,可将数据查询操作放在数据层的数据库服务器中,通过由客户查询需求设计的存储过程来完成数据查询的任务.因此,在数据访问接口的设计中,需要设计存储过程调用接口模块,通过该模块,根据客户的不同查询需求,调用相应存储过程完成查询任务.在存储过程调用接口模块设计中,首先判断数据库连接和登录操作是否完成,如果没有完成,则完成相应的数据库连接和登录操作,然后获取执行参数,这里执行参数由3部分构成,分别是存储过程名、存储过程in参数列表及存储过程out参数个数.由in参数列表动态构建和设置存储过程的in参数,由out参数个数动态构建和设置存储过程的out参数类型,调用存储过程,获取并返回查询结果集.其算法设计如下:
GetInfo(storageprogramname,In-pram,Out-pram-length)
参数说明:
storageprogramname:存储过程名
In-pram:存储过程in参数列表
Out-pram-length:存储过程out参数的个数值
begin
如果没有完成数据库的连接和登录操作,则先完成相关操作;
String str=″{call″ + storageprogramname + ″(″;
repeat
str=str + ″?,″;
untile In-pram参数列表处理完;
repeat
str=str + ″?,″;
until Out-pram-length - 1处理完;
str = str + ″?)}″;
st =conn.prepareCall(str);
repeat
设置st的in参数值;
until In-pram参数列表处理完;
repeat
设置st的out参数值类型;
until Out-pram-length参数处理完;
结果集rs执行存储过程storageprogramname;
return结果集rs;
end
存储过程返回查询结果集后,需要将查询结果集的数据封装到数据对象中,这样便于为后期JSON数据封装处理提供数据源.在数据对象的封装处理过程中,首先根据查询需求,设计出数据对象的实体类,然后根据获取的查询结果集,将其数据写入实体类的对象中.
以客户信息查询为例,在客户信息查询需求中,客户信息由客户基本信息和客户推荐产品信息构成,客户信息查询数据类的UML设计如图3所示.
图3客户信息查询数据类的UML结构
从图3可知,客户查询数据类ClientInfo的对象包含了经理数据类ManagerInfo的对象(manager)和客户产品推荐类Recommends的对象(recommends),其中,类ClientInfo与类ManagerInfo之间是1∶1的关联关系,类ClientInfo与类Recommends之间是1∶n的关联关系.这些类之间的关联关系也体现了数据库的多表关联查询的形式.客户信息查询的数据对象封装算法设计如下:
getClients (rs1,rs2)
参数说明:
rs1:客户基本信息查询结果集;
rs2:客户推荐产品信息查询结果集
begin
构建ClientInfo类的对象集合clients和Recommends类的对
象集合res;
i←0;
repeat
c←创建ClientInfo对象;
将rs1的第i条数据记录的ClientInfo对象基本分量写
入c;
m←创建ManagerInfo对象;
将rs1的第i条数据记录的ManagerInfo对象分量写入m;
c的ManagerInfo对象分量manager←m;
j←0;
清空res;
repeat
r←创建Recommends对象;
将rs2的第j条数据记录的Recommends对象分量
写入r;
res←r;
j←j + 1;
until rs2结果集中所有数据记录处理结束;
c的Recommends对象分量recommends←res;
clients←c;
i←i + 1;
until rs1结果集中所有数据记录处理结束;
return clients;
end
在本算法中,rs1和rs2都是通过GetInfo接口获取的查询结果集,最后根据rs1和rs2的结果集,将相应数据封装到客户信息查询数据对象集合clients中.
一般而言,在证券数据交易系统的查询中,为了提高查询效率,在客户端浏览器进行查询后,客户端浏览器只需要接收精简的查询结果数据,而不需要接收臃肿的html数据代码.为了实现这种策略,需要将查询结果数据封装为JSON数据,然后返回给客户端浏览器.由于JSON数据格式是一种轻量级的数据交换格式,其广泛应用于网页数据的存储和交换文本信息,客户端很容易利用JS解析JSON数据并在客户端浏览器按照指定样式显示数据.因此,客户端浏览器接收JSON数据,有利于后期的解析处理.
在数据对象封装模块中,客户查询数据已经封装到数据对象中,在JSON数据封装模块中,根据数据对象,将查询数据以JSON格式进行封装.尽管专门有封装JSON数据的类库,但由于查询结果数据的结构复杂多样,直接使用类库产生特殊格式的JSON数据会比较困难.因此,本研究设计了特定的JSON数据封装模块,其以数据对象为数据源,进行JSON数据封装,并最终形成JSON字符串.JSON数据封装模块算法设计如下:
ClentsJsonString(list)
参数说明:
list:客户信息查询数据对象集合,其为getClients算法的clients
begin
if list集合中数据对象个数 = 1 then
将list集合中第1条数据记录的ClientInfo对象基本分
量按照JSON格式构建字符串JsonString1;
j←0;
repeat
recommends←获取list集合中第1个数据记录的第
j个Recommends对象分量;
将recommends按照JSON格式构建字符串
JsonString2;
JsonStr集合←JsonString2;j←j + 1;
until list集合中第1条数据记录的Recommends对象分
量处理结束;
根据JsonStr集合构建嵌套结构的字符串JsonString3;
JsonString←JsonString1 + JsonString3;
else if list集合中数据对象个数 > 1 then
i←0;
repeat
clientInfo←获取list集合中第i条数据记录的
ClientInfo对象基本分量;
将clientInfo按照JSON格式构建字符串JsonString1;
j←0;清空JsonStr集合;
repeat
recommends←获取list集合中第i条数据记录
的第j个Recommends对象分量;
将recommends按照JSON格式构建字符串JsonString2;
JsonStr集合←JsonString2;j←j + 1;
until list集合中第i条数据记录的Recommends对
象分量处理结束;
根据JsonStr集合构建嵌套结构的字符串JsonString3;
JsonString4←JsonString1 + JsonString3;
JsonStr2集合←JsonString4;
i←i + 1;
until list集合的数据对象处理结束;
根据JsonStr2集合构建嵌套结构的字符串JsonString5;
JsonString←JsonString5;
end if
return JsonString;
end
在ClentsJsonString算法中,list为getClients算法处理的数据对象集合clients,其由1个或多个数据对象构成.ClentsJsonString算法根据数据对象集合list利用JSON数据格式进行JSON数据封装,在封装过程中,会根据数据对象之间的关联,构建具有嵌套结构的JSON字符串JsonString.
在证券数据交易系统中,客户通过客户端浏览器以get请求方式调用数据访问接口进行查询,数据访问接口首先在浏览器的地址信息中获取查询的参数,然后将查询参数传递给存储过程调用接口模块执行查询,接着将查询结果集传递到数据对象封装模块进行数据对象的封装处理,接着将封装后的数据对象传递到JSON数据封装模块进行JSON数据封装处理,最后将封装后的JSON字符串返回到客户端浏览器.在后期,可以由客户端的JS进行解析操作.由于数据访问接口是通过网络请求方式调用,因此采用Servlet方式设计,其部署在Tomcat的Web服务器端.数据处理流程如图4所示.
图4数据访问接口的数据处理流程
在测试中,数据访问接口采用Java编程实现,Web服务器采用Tomcat 7.0进行部署,数据库服务器系统采用SQL Server 2008 R2,数据库连接与登录的参数配置文件内容如图2所示,其部署在Tomcat服务器中.
接口设计中,首先需要根据客户的查询需求设计不同的多个数据访问接口,本研究以客户信息查询需求为例,设计并测试了客户信息查询数据访问接口的运行结果.在数据库服务器系统中部署了相应的数据表和存储过程,其中,ClientInfo表(用户信息表)如表2所示,ManagerInfo表(客户经理信息表)如表3所示,ClientRecommendation表(客户推荐产品表)如表4所示,客户基本信息查询存储过程如图5所示,客户推荐产品信息查询存储过程如图6所示.
表2 ClientInfo表
表3 ManagerInfo表
表4 ClientRecommendation表
图5客户基本信息查询存储过程
图6客户推荐产品信息查询存储过程
客户端浏览器查询界面如图7所示,在客户端浏览器的http请求地址中,testServlet为数据访问接口名、Id为查询参数,其为客户身份编号(以get请求方式传递查询参数到testServlet接口),查询结果以JSON数据格式进行嵌套封装后返回到客户端浏览器,从图7可以看出,返回到客户端浏览器的数据不再是冗余的html代码,而是精简的可解析查询数据.
图7数据访问接口查询的返回结果
针对证券数据交易系统查询的特殊性,本研究采用了分层的数据访问接口,通过该接口的实现可以看出,一方面分散了各部分的查询压力,另一方面也精简了查询结果的返回值,进而从整体上提高了查询效率.本研究为证券数据交易系统的查询功能提供了一种可实例化的设计模式.