当我们以一个项目的方式来完成软件设计开发时,通常开发的具体环境已经确定,采用的数据库也已经确定,因此不存在支持多数据库方面的需求。但是,如果一个软件以产品的方式出现,需要以同一产品适应不同企业的IT环境时,多数据库支持将是一个非常重要的需求;如何实现多数据库支持,将直接关系到产品的质量及实施和维护成本,关系到产品推广的范围和最终的成败;本文将就当前常用的多数据库实现方式做一简要介绍,并以笔者所在公司开发的某软件中采用的多数据库支持实现技术做一介绍。
实现了多数据库支持的软件产品通常采用以下几种方式:
1.统采用分层结构,为每种数据库实现一套数据访问层。该方案具有实现简单、结构清晰的优点,但也具有很多问题。软件中的某功能点修改可能牵涉到多套数据访问层的修改,同时,也会给测试带来成倍增长的工作量;由于实现同样数据访问功能需要对不同数据库编码,所以肯定会带来更大的编码量、引入更多的Bug,影响软件质量。
2.系统采用的SQL语句置于系统外部,SQL语句分为多套,每种数据库维护一套SQL语句。该实现方式可以在部分情况下达到不修改代码而调整系统的目的、设置在简单的情况下可达到不修改代码而增加一种新数据库支持的目的。但该实现方式存在调试困难、维护易出错的缺陷。同时,如果系统较复杂的情况下,难以体现出其优点,实用性不高。
3.采用标准SQL语句实现多数据库支持。该方法是谈论较多的方法,但真正采用该方法实现了多数据库支持的软件系统的厂商并不多。原因在于各数据库厂商对标准SQL的支持是不完全的,而且,对系统开发者而言,要求其能准确区分出那些是标准SQL,那些是特定数据库SQL,这本身并不现实;而一旦采用了特定数据库SQL而测试又不是非常充分的话,就会埋下很多定时炸弹。
笔者所在公司在实现eHR软件多数据库支持功能前,提出以下要求:
1.能很方便的实现对新数据库的支持,最好能达到不修改采用该方法实现的系统的代码就能增加对新数据库支持。
2.系统修改、维护容易,编码工作量最好与支持的数据库种类多少无关。
针对以上的一些,我们提出了以下的多数据库支持的实现方案:
解决方案由三部分构成:SQL实体描述对象、SQL语句生成器、SQL实体执行器;这些部分构成一个介于数据访问层与数据库间的新的软件层(Data I/O Controler),供数据访问层调用;
与通常的多层体系结构软件比较起来,该方案不同之处在于数据访问层访问数据库方法并不是直接执行SQL语句,而是以SQL实体对象的方式描述出对应SQL语句的语意;然后调用SQL实体执行器对SQL实体描述对象处理,生成对应的数据类型的SQL语句,并执行。在SQL执行器中,为了能支持多数据库,需要对没种数据库实现一个以独立DLL方式存在的Adapter,该Adapter接收传入的SQL实体对象,并能根据SQL实体对象描述的语意,生成符合对应数据库语法的SQL语句。Adapter需要实现一系列预先定义好的接口,以方便SQL实体执行器的调用;SQL实体执行器在运行期间才与具体Adapter关联,不必事先知道由何种Adapter处理SQL实体对象;当需要增加对新数据库的支持时,不必修改任何原有软件,只需要实现一个新的Adapter就可;
该方案将支持多数据库的复杂性与具体软件隔离开来,将复杂性由通常的分布于软件各处变更为于一点集中处理,可使维护更容易、编码量大大降低,系统可靠性更高;