数据库统一接口设计与实现
数据库统一接口设计与实现
强晓琳
( 西北工业大学软件学院, 西安 710065)
摘 要 在一个项目中, 当多个相关产品都用到了商用磁盘数据库时, 从数据库的选型到应用层接口可能都不统一。虽然 ODBC( 开放数据库互连) 能在Windows平台上为应用层软件提供数据库平台无关性, 但在LINUX平台上还不成熟。基于上述情 况, 在LINUX平台上, 为应用层软件提供一个中间层数据库统一接口, 它屏蔽掉不同的数据库软件平台的差异, 使用户可以专注 于业务实现, 便于产品维护。 关键词 数据库统一接口 平台无关性 OCI( Oracle 应用编程接口) CT- LIB( Sybase应用编程接口) 中图法分类号 TP311.138; TP311.138; 文献标识码 B
可能 ORA( 代表 ORACLE) 和 SYB( 代表 SYBASE) ,
所有的接口判断条件都是以此来判断。
考虑到本模块同后面其它模块之间的关联, 在
对 SQL 语句进行处理时需要一个统一的句柄指针。
所谓句柄是指向一块内存区域的指针, 这块区域用
来存储服务上下文或者跟连接有关等方面的信息。
句柄是由相应的数据库 API 来维护的, 用户只需调
3 数据库调用统一接口设计
数据库统一接口不仅意味着接口调用的统一, 还意味着各种操作的数据类型、语句类型的统一。 不同的数据库平台定义了不同的数据类型, 根据产 品的需求抽象出所需的数据类型并加以重新定义。 通过对 OCI 和 CT- Library 的分析、比较可以得出, 统一接口可以分为以下若干模块:
省值。 图 11 中的统一接口函数相对比较复杂, 它有 5
个 参 数 , 分 别 为 : 句 柄 指 针 handler、 参 数 位 置 position、参数类型 type、参数值的长度 len 和指向改
1504
科学技术与工程
6卷
图 13 异常处理函数对照示意图
图 14 关闭释放连接函数对照示意图
根据对相关产品的语句类型使用的了解, 可以
抽象出如下语句类型。
SQL_NORMAL
定 义 了 普 通 SQL 操 作
数据类型
SQL_PROCEDURE 定 义 了 存 储 过 程 操 作
语句
3.3 据库平台声明、定义
数据库操作系统变量: DB_ENV, 见图 3。
用于区别不同的数据库操作系统。取值有两种
1 设计思想
一个基于数据库统一接口的应用程序对数据 库的操作不依赖于 DBMS( 数据 库管理系统 ) , 它不 直接与 DBMS 打交道, 所有的数据库操作由统一接 口 程 序 完 成 。 也 就 是 说 , 不 论 是 SYBASE 还 是 ORACLE 数据库, 均可用统一的 API 进行访问。
随着计算机技术的飞速发展, 数据库技术的应 用领域也日趋扩大和深入。数据库从根本上改变了 许多公司和个人的工作方式, 它是信息系统的基本 框架。ODBC 的出现, 为异构数据库和不同的数据库 管理系统之间的互操作带来了方便。受到 ODBC 实 现原理的启发, 对于在 LINUX 平 台上较为流 行的 ORACLE 和 SYBASE 数据库, 数据库统一接口提供 了一组对数据库访问的 API ( 应用程序编程接口) , 它能以统一的方式处理这两种数据库。
用其中的分配和管理句柄的库函数即可。
图 3 统一后的句柄指针示意图
1502
科学技术与工程
6卷
SYBASE 和 ORACLE 的 API 分 别 有 不 同 的 句 柄 操 作 函 数 , 在 CT- LIB 中 该 句 柄 指 针 相 当 于 DBPROCESS , 而 在 OCI 中 相 当 于 OCIStmt。 这 里 统 一 为 DBHANDLE 结 构 , DBDBHANDLE 结 构 中 还包含其它用于不同功能的句柄或相关变量, 用 户所有的数据库操作都需要提供该句柄指针, 用 户在第一次库操作前必须首先向本模块申请一个 句柄, 在操作完后应该尽快释放句柄以供他人使 用。 3.4 初始化模块
初始化模块为系统中的第一个被用户程序调 用的模块, 该模块在对数据库进行任何操作前调 用。该模块读取相关配置文件, 在配置文件中存放 着各种静态配置信息, 初始化各种全局或局部变 量, 为用户的库操作准备各种必要的资源。对应于 此, 本模块包括以下各种声明和初始化:
( 1) 不同数据库系统全局变量声明; ( 2) 不同数据库系统宏定义; ( 3) 不同数据库系统全局函数声明; ( 4) 不同数据库系统数据类型声明; ( 5) 不同数据库系统连接的建立; ( 6) 不同数据库系统的配置文件。 在初始化函数中需要对各种变量进行初始化 并进行处理, 过程如图 4。 3.5 SQL 语句处理模块 SQL 处理模块处理具体的用户库操作请求, 并 将操作结果返回给用户。根据定义的数据库平台调 用对应平台的库函数, 在这个过程中涉及本模块定 义的数据类型到数据库类型的转换等操作。
DB_STR
定义数据库字符串类型
DB_INT
定义数据库整数类型
DB_SHORT 定义数据库缩写类型
DB_DATE 定义数据库日期类型
DB_FLOAT 定义数据库浮点类型
DB_BIN
定义数据库块操作类型, 相当于
ORACLE 中 的 RAW 类 型 或
SYBASE 中的 binary 类型
3.2 语句类型定义
第 6 卷 第 11 期 2006 年 6 月 1671 - 1815 ( 2006) 11 - 1500 - 06
科学技术与工程
S科cienc学e Tec技hnolo术gy an与d Eng工ineer程ing
Vol. 6 No. 11 Jun. 2006 c 2006 Sci. Tech. Engng6.卷
2006 年2 月6 日 收 到 作者简介: 强晓琳( 1980—) , 女, 黑龙江省望奎县人, 西北工业大学软 件学院03级硕士生。研究方向: 数据库及应用。E- mail: windflower_414 @163.com。
图 2 数据库统一接口的内部分层
11期
强晓琳: 数据库统一接口设计与实现
准备 SQL 语句函数如图 6 所示。 如 图 7, CT- Library 相 对 比 较 简 单 ( dbfcmd()是 可以将变量值作为 SQL 语句的输入) 。 在 OCI 中 , OCIStmtPrepare ( ) 函 数 后 面 的 两 个 参数可以取缺省值。因此, 通过对这两个函数的比 较, 可以得到图 7 中的统一接口。 该接口的第一个参数的类型统一为 DBHANDLE*, 第二个参数为 SQL 字符串。 3.5.2 执行 SQL 语句 图 8 中, dbsqlexec( ) 的语法比较简单: RETCODE dbsqlexec( dbproc) 。 返回值是 TRUE 或者 FALSE。 OCIStmtExecute ( ) 中 的 后 四 个 参 数 可 取 缺 省 值。对于第四个参数 iters, 根据所执行的语句是否 为 select 类型而有所不同。 图 9 是从这两个函数得到的统一接口。 上层应用在准备好 SQL 语句之后, 只需简单地 调用该函数就可以执行 SQL 语句了。 3.5.3 绑定 SQL 语句输出变量占位符 图 10 所示的作用是将库操作待返回的结果与 用户指定的变量绑定, 其中, DB- Library 中主要是 dbbind( ) 的语法如图 11。
图 4 初始化过程示意图
图 5 SYBASE 和 ORACLE 编程接口的 SQL 语句处理函数对照示意图
11期
强晓琳: 数据库统一接口设计与实现
1503
图 6 准备 SQL 语句函数对照示意图 图 8 执行 SQL 语句函数对照示意图 图 10 绑定 SQL 语句输出变量占位符函数对 照示意图
图 7 综合得出统一接口准备 SQL 语句函数示意图
参数的地址指针 addr。 3.5.4 获取查询结果
获取数据时 , CT- LIBRARY 使用 dbresult ( ) 函 数来获取, 该函数的语法如下:
RETCODE dbnextrow( dbproc) ( 如图 12) 而 OCI 获取数据则通过 OCIStmtFetch( ) 函数来 获取。 对于一般应用, nrows 取 1, 后两个参数取缺省。 对这两个函数进行比较, 可得出图 12 中的统 一接口。 3.5.5 SQL 语句输入变量动态绑定操作 ORACLE 数 据 库 支 持 输 入 条 件 或 输 入 变 量 的 动态绑定, 而 SYBASE 数据库并不支持该特性, 因 此输入 变量动态绑 定功能 仅 适 用 于 ORACLE 数 据 库平台。虽然此项功能不具有平台无关性, 但是当 数据库平台 为 ORACLE 数据库 时 , 建 议 支 持 该 特 性, 因为它可以一定程度上提升系统性能。 3.6 异常处理模块 如 图 13 所 示 , 对 于 库 操 作 的 异 常 和 错 误 , ORACLE 和 SYBASE 定 义 了 不 同 的 处 理 方 式 和 函 数, 统一接口模块通过对相关数据库平台异常处理 函数的调用处理所出现的异常。对于应用层代码来 说只需要关心统一接口函数调用是否成功, 具体的 异常处理已经在不同数据库函数调用时得到了处 理, 并返回错误代码和原因。
图 1 数据库统一接口在应用软件中的位置
口。因此数据库统一接口实际上包含面向数据库和 面向应用层的两个接口。对于面向数据库层的统一 接口, 需要考虑支持和封装的数据库接口类型, 这 里选择支持 最常用的 ORACLE 数据库下的 OCI 接 口和 SYBASE 数据库下的 CT- LIB 接口。基于模块 化的原则, 在内部将统一接口细分为上下两层, 见 图 2。
ORACLE 和 SYBASE 数 据 库 对 于 具 体 的 SQL 语句处理存在差异, 但是逻辑上都需要数据准备、 数据绑定、语句执行、得到结果等步骤。图 5 列出了 他们之间的对应关系。