开发基础框架进行应用与数据库访问的封装
0
引言
我们在
基金管理公司核心业务系统(登记过户、直销)开发初期(1.0)版时采用直接调用TUXED服务的方式,在实际应用中存在如下问题:首先绑定了TUXED通讯中间件,其次是绑定了Oracle数据库,这些不利于系统的扩展与项目的产品化,即系统的伸缩性较差,从而限制了系统的应用。
基于以上问题在我们的基金管理公司核心业务系统(登记过户、直销)开发(2.0)版开发时引入了基础框架的概念,总体思想就是在基础框架进行系统封装,通过对基础框架的配置与管理使应用满足不同的通讯中间件与数据库,取得了比好的效果,供大家分享如下:
1
设计目标
基础框架的总体设计目标是降低应用开发的难度,提高开发效率,缩短开发周期,快速适应市场和用户需求的不断变化。同时,通过标准化、规范化后台应用的开发方式和流程,使系统易于维护和修改。
面对不同的用户和开发阶段,基础框架的设计目标可以概括为
3点,一是为系统后台的各种业务处理模块提供一个基础运行平台;二是为后台应用开发人员提供一个综合开发平台;三是为系统的管理人员提供一个管理平台。
作为运行平台,基础框架必须对业务处理所需的各种环境和资源进行统一管理,并充分考虑关键任务处理系统在性能、可靠性、可扩展性等方面的需求。作为开发平台,基础框架要对通信、数据加解密和校验、数据串行化和反串行化、应用路由等系统逻辑进行有效封装和透明化处理,使应用开发者可以专注于业务逻辑的实现。作为管理平台,基础框架需要对系统的运行状态实时进行监控,并能根据系统管理员的指令动态调整系统的行为。
2设计原则和设计思想
基础框架设计的各项原则在思想上是相辅相成、密不可分的,将设计原则分别描述是为了突出不同方面需求在框架中的重点体现。
| ||||||||||||||||||||||||||||||||||||||
2.1基于框架(Framework)
实践证明,基于框架的开发是提高系统可靠性、可扩展性和互操作能力的有效途径,已有的商品化和开放源码的服务端框架过于复杂且不能完全满足系统的具体需求。我们针对目标系统的需求和特点选择自己开发服务端框架,框架可以视为一个专用的应用服务器或容器,业务逻辑处理功能以构件为单位部署在框架之内,框架为构件提供与外部的数据通道、根据部署描述调度和控制构件的执行。
2.2系统逻辑和业务逻辑分离
系统选用
TUXEDO中件作为基础平台,与具体应用无关的系统逻辑由中间件实现。针对目标系统特定的系统逻辑由基础框架实现,目标系统需要使用但与目标系统无直接关系的功能作为系统逻辑在基础框架内以系统公共函数的形式实现,与目标系统紧密相关的共性业务需求作为业务逻辑在基础框架内以系统公共函数的形式实现,个性化的业务需求在每个业务构件内实现。图2-1展示了系统逻辑和业务逻辑的关系和各自的实现方式。
![]()
图
2-1
系统逻辑和业务逻辑
| ||||||||||||||||||||||||||||||||||||||
2.3模块化和构件化
模块化是几乎所有软件系统设计时都共同遵循的设计准则,基础框架的设计也不例外。一方面,基础架构本身要按照强内聚、弱藕合的原则分解为不同的功能模块;另一方面,基础架构要为业务应用的模块化创造条件,使业务模块的划分更直观和自然。
构件化设计实际上是模块化设计的延伸和升华,二者的目标和价值在总体上是相同的。需要指出的是,构件化的设计和开发并不是面向对象方法的专利,从广义上讲只要封装了内部实现并可由“客户”通过接口访问的功能单元都可称之为构件。在设计中,我们将独立负
责实现某个业务逻辑的函数称为“业务构件”,独立性是其区别于其他辅助函数和公共函数的标志,其他任何一个函数都不能单独地实现全部的业务逻辑。
2.4可重用
设计公共函数和构件的目标就是为了重用,通过重用可以有效减少开发过程中编码和测试的时间,提高系统的开发效率和质量。可以在系统公共函数级、业务公共函数级和构件级三个层次重用
2.5充分利用中间件提供的功能
上文已经多次提到
TUXEDO中件件,对于有经验的开发人员来说,中间件的重要意义不言而喻,中间件产品已经成为开发各种规模的应用不可缺少的工具和平台。产业分工的日益明确决定我们不可能什么都自行开发,充分利用行业发展和技术进步的成果,快速地将高质量的产品推向市场是每个企业保持竞争优势的关键。
对于我们的应用来说,我们可以选用
TUXEDO的各种基础服务来搭建自己的系统,这些基础服务包括安全控制、事务控制、通信、高可靠消息队列、负载均衡等运行时支持,也包括ATMI、WTC(WebLogic Tuxedo Connector)等适用于不同开发语言的功能强大的API。
| ||||||||||||||||||||||||||||||||||||||
2.6适当的技术独立性
技术独立性指基础框架的设计开发要避免绑定到某一个产品或平台,以适应潜在客户在产品选型上的差异。
首先要考虑的是硬件平台和操作系统,目前我们选择的是IBM公司的RS/6000小型机和AIX操作系统,在可能条件下,要注意对UNIX标准和C语言标准的遵从,降低以后移植到其他厂商UNIX系统的难度。
其次是数据库,目前选择的是ORACLE公司的Oracle 9i,开发时要注意以下几点:
u
使用标准的数据类型
u
使用标准的SQL和嵌入式SQL语法,避免使用ORACLE实现的特殊语法和函数
u
使用统一的出错处理机制
u
要减少或避免使用难于移植的存储过程
u
不使用数据库提供的开发报表和交互界面的4GL语言
最后要考虑的是TUXEDO,当前项目在交付时间上的约束决定基础框架不可能独立于中间件,只能从以下几方面减少对中间件的依赖程度:
u
业务构件和公共函数在普通函数内实现,而不是TUXEDO的SERVICE
u
因为应用结构中不需要两阶段提交,不使用TUXEDO提供的事务控制
u
除了字符串缓冲区外,不使用TUXEDO提供的其他缓冲区类型
u
除了同步调用和会话方式外不使用其他通信方式
u
不使用定制验证服务器的方式进行安全控制
保持技术独立性的目的是为了适应潜在客户群在平台选型上的差异。
3总体结构
不同用户从不同角度观察系统会看到系统的不同表现形态,为了全面地描述后台服务框架的技术架构,我们分别从几个侧面对服务框架进行定义,通过对系统不同视图的展示,使各方人员对系统架构的认识和理解达成一致。
| ||||||||||||||||||||||||||||||||||||||
3.1全局视图
全局视图定义目标系统的位置和与其他子系统的关系,并简单描述组成系统的每个子系统的分工。全局视图(略)
3.2物理和实施视图
物理视图定义目标系统开发和部署时所用外部软硬件环境,指定了可用的外部资源和技术约束条件。
![]()
图
3-2
物理和实施视图
如上图所示:系统选用
IBM的P系列服务器(RS/6000)作为硬件平台,使用的操作系统是IBM AIX4.3.3,中间件选用BEA公司的Tuxedo 6.5,用Oracle 9i作为系统的数据库管理系统。TA系统的基础框架和各模块的应用构件都使用标准C语言进行开发,通过ATMI接口调用Tuxedo API,通过PROC*C访问Oracle数据库。
| ||||||||||||||||||||||||||||||||||||||
3.3逻辑视图
逻辑视图是技术架构设计的核心部分,它定义了基础框架内部的结构、功能和业务构件使用他们的方式,图3-3展示了基础框架逻辑组织。
![]()
图
3-3
逻辑视图
基础框架是所有业务模块和业务构件运行的技术支撑平台,根据系统的设计目标,基础框架应该满足为用户提供运行平台、开发平台和管理平台
3个方面的功能。
| ||||||||||||||||||||||||||||||||||||||
4数据库访问函数接口定义
5
数据库访问封装函数举例(oracle建立数据库连接)
#include<stdio.h>
#include<string.h>
#include<assert.h>
#include"berrno.h"
EXEC SQL INCLUDE oraca;
EXEC SQL INCLUDE sqlca;
EXEC ORACLE OPTION (ORACA=YES);
/**
* @func
连接数据库
* @ipara
pczUserName 用户名
* @ipara
pczPassword 口令
* @ipara
pczDatabase 数据库名
* @ipara
pczConString 连接字符串
* @return
BIZ_SUCC 成功
* @return
BIZ_FAIL 失败
*/
int BDBA_PUBLIC_Connect(pczUserName, pczPassword, pczDatabase, pczConString)
EXEC SQL BEGIN DECLARE SECTION;
| ||||||||||||||||||||||||||||||||||||||
const char *pczUserName;
const char *pczPassword;
const char *pczDatabase;
const char *pczConString;EXEC SQL
END DECLARE SECTION;
{
/**
* @seq 断言检查
*/
assert(pczUserName != NULL);
assert(pczPassword != NULL);
assert(pczDatabase != NULL);
assert(pczConString != NULL);
oraca.orastxtf = ORASTFERR;
/**
* @seq 连接数据库
*/
if(strlen(pczDatabase) == 0 && strlen(pczConString) == 0)
{
EXEC SQL CONNECT :pczUserName IDENTIFIED BY :pczPassword;
}
if(strlen(pczDatabase) != 0 && strlen(pczConString) == 0)
{
EXEC SQL CONNECT :pczUserName IDENTIFIED BY :pczPassword AT :pczDatabase;
}
if(strlen(pczDatabase) == 0 && strlen(pczConString) != 0)
{
EXEC SQL CONNECT :pczUserName IDENTIFIED BY :pczPassword USING :pczConString;
}
if(strlen(pczDatabase) != 0 && strlen(pczConString) != 0)
{
EXEC SQL CONNECT :pczUserName IDENTIFIED BY :pczPassword AT :pczDatabase USING :pczConString;
}
| ||||||||||||||||||||||||||||||||||||||
if(sqlca.sqlcode != 0)
{
giBErrNo = sqlca.sqlcode;
return(BIZ_FAIL);
}
return(BIZ_SUCC);
}
6
结束语
通过在数据库服务器与客户端应用之间构筑基础架构,完成对数据库数据访问的封装,只需要在基础架构进行相应的开发、配置就能满足Orcale, Sybase,Informix,SqlServer,DB2等不同的数据库服务器应用,而业务应用不需任何改变,这就大大提高了系统的灵活性与扩展性,由于在基础架构层是直接调用相应数据库提供的驱动程序,因此在系统实际运行中处理效率也得到了很好的保证。
虽然该基础架构平台是为基金管理公司核心业务系统(登记过户、直销)而开发,但其设计思想与理念则适合所有数据库开发应用,因此应该具有很好的推广价值。
|