关于:程序兼容多种数据库
以前老早就想让程序可以兼容不同的数据库。sql server,access,my sql,oracle.
大部分在做兼容数据库的做法,都是以“工厂模式+反射机制”这种模式建立的。也就是要对不同能数据库,建立不能DAL层。
如果数据库小还好说。如果数据库很庞大,单单写4个数据库的DAL层,就是一个非常浪费时间的事情。
于是我想,如果UI,DAL,BLL这些层不动,仅仅修改DB访问层,是不是可以实现。
在放假期间用一个小型网站,试验了一下。
这个工程是基于普通三层架构的。 与普通三层架构的区别: UI,BLL这这两个层基本上没有变化。DAL层有少许变化。而变化最大的就是DB数据访问层。
DB层思路:
1.建立一个IDBHelper。 实现我们经常要用到的数据访问接口。
2.分别建立不同的 IDBHelper的实例,用于访问sql server,access,my sql,oracle.
3.建立一个 DBHelper 类,用于根据不同的类型创建不同的IDBHelper 并调用接口的方法。
4。还有其他的的细节方面,如参数:sql server是@,oracle是:access是?等等,不再细说。
这样,根据web.config中访问不同的数据库的链接字符串。就可以创建不同的IDBHelper的访问实例。也就可以访问不同的数据库了。
DAL仅仅是根据 DB层修改一下访问方式即可。
效果如何呢?(由于我机器上,没有 my sql和oracle。所以只能测试,sql server 和access了)
执行一个查询语句select * from table1
这个在sql server和access上都没有问题。让我一阵欣喜。
于是又执行了一个插入:insert into table1(name)values(‘aa’);select @@IDENTITY
sql server执行没有问题。在access中执行出现“ 在SQL 语句结尾之后找到字符 ”。原来是access一次只能执行一条语句。此时我才恍然,为什么都是用 “工厂模式+反射机制”来
并不是因为sql语句不兼容。如果我都按照标准sql语句来实现,也是没有问题。
可是,最主要的是性能。sql语句执行的性能,和我创建的DBHelper 类的不断判断到底创建哪种IDBHelper的实例。都需要时间。
我对性能测试,不是很了解。但从理论上来讲,每一个sql都不能最大化的发挥出其性能。(或许是按照这4中数据库的最慢的为执行速度吧。不太清楚)
我决定放弃了这种做法。放弃会丢失性能的做法。
我还是老老实实的用 “工厂模式+反射机制”来实现吧。
这里仅仅讲的是理论。没有给出实际代码。
如果您看完上面的内容,有想法,就请发表一下意见吧。