暂时无题

还没想到

升级我的数据库辅助类(提供下载)

petshop通过抽象工厂实现了数据库的自由切换,但是我不喜欢这种方式。一是需要多建好几个项目,每一个数据库都要一个DAL和Help类。项目多了,代码量自然也多了,维护起来不方便,修改一个东西要改动好几个地方。

它是在DAL层面实现的数据库切换,几个Help没有什么联系,而且代码大量重复。为什么不在Help类里实现数据库里切换呢~这样只需要一个DAL,在配置文件里改一下,Help类就会返回不同数据库的对象供DAL使用。怎么实现呢,我想到了两种方式。

第一个自然是反射,使用System.Data.Common命名空间的类,代码如下:

Code

比较不好处理的是DbParameter,程序里用的是DbParameter数组,自然可以接受SqlParameter或OleDbParameter数组,可以像Petshop那样在外部构建一个SqlParameter数组传进来就行了。但是这样客户端就必须知道具体数据库的类型,没有达到封装的目的。我见yueue.ADOKeycap的处理方式不错,但是我的全是静态方法,不能这么搞,于是想了一个笨方法。做了一个类。

Code

这样就可以像这样调用了。

Code

这样改造之后应该就可以实现自由切换数据库了。只需修改一下配置文件就Ok。但是我却有点不安,因为在静态方法里使用了反射,每次调用都要反射一次(为了行文方便,这种方法我暂且称之为静态反射),会不会降低性能呢~

于是想到了另一个方法,使用策略模式。先写一个Help的abstract类:

Code

然后不同的数据库重写方法,比如SqlServer的

Code

然后是Context类:

Code

这样只是读取数据库类型的时候反射了一次,性能应该影响不大,这样调用。

这样做也有不好的地方,相比静态反射方式要多写不少代码,每加一个数据库都要写一个相应的Help类。

下面测试一下各个的性能。

测试数据库脚本:

Code

测试对象: SqlHelp类 ,静态反射,策略模式

测试方法:

1.用三种方法分别向数据库插入10W条数据(注意:这个辅助类不适合处理大量数据插入的任务,这里仅是测试,真实项目中不要这么做)。

2.用三种方法分别向数据库插入10条数据。

测试代码:

SqlHelp:

Code

静态反射:

Code

策略模式:

Code

测试结果:

SqlHelper第一次 插入10W条数据,程序运行耗时:159888488663

SqlHelper第二次 插入10W条数据,程序运行耗时:
160687917724

SqlHelper第三次 插入10W条数据,程序运行耗时:
154527187035


策略模式第一次 插入10W条数据,程序运行耗时:
158770717499

策略模式第二次 插入10W条数据,程序运行耗时:
160742563763

策略模式第三次 插入10W条数据,程序运行耗时:
154720465316


静态反射第一次 插入10W条数据,程序运行耗时:
229434867004

静态反射第二次 插入10W条数据,程序运行耗时:
214389131899

静态反射第三次 插入10W条数据,程序运行耗时:
210254611603

由此可见,策略模式的方式还是不错的,与Sqlhelper相比几乎没有性能损失,静态反射方式则性能损失明显。这么说我应该选择策略模式作为最后的解决方案了?不一定,刚才说了,这个辅助类不适合处理大量数据插入的任务,这个测试仅仅是为了看看三种方式处理大数据的性能,现实中遇到这样的任务早用其他方式优化了。所以这样的方式在现实中的使用率基本为0,靠这个测试来下结论是没有意义的。下面看插入10条数据的测试,这个才是比较常见的任务~

测试结果:

SqlHelper第1次 插入10条数据,程序运行耗时:24282828

SqlHelper第2次 插入10条数据,程序运行耗时:
13098557

SqlHelper第3次 插入10条数据,程序运行耗时:
13076609

SqlHelper第4次 插入10条数据,程序运行耗时:
15343301

SqlHelper第5次 插入10条数据,程序运行耗时:
13700515

SqlHelper第6次 插入10条数据,程序运行耗时:
14315018

SqlHelper第7次 插入10条数据,程序运行耗时:
13333270

SqlHelper第8次 插入10条数据,程序运行耗时:
18766929

SqlHelper第9次 插入10条数据,程序运行耗时:
13543373

SqlHelper第10次 插入10条数据,程序运行耗时:
14285184

SqlHelper第11次 插入10条数据,程序运行耗时:
13966000

SqlHelper第12次 插入10条数据,程序运行耗时:
16312366

SqlHelper第13次 插入10条数据,程序运行耗时:
16657053

SqlHelper第14次 插入10条数据,程序运行耗时:
16684147

SqlHelper第15次 插入10条数据,程序运行耗时:
13948950



策略模式第1次 插入10条数据,程序运行耗时:
28917960

策略模式第2次 插入10条数据,程序运行耗时:
13024157

策略模式第3次 插入10条数据,程序运行耗时:
12921475

策略模式第4次 插入10条数据,程序运行耗时:
15099535

策略模式第5次 插入10条数据,程序运行耗时:
13556757

策略模式第6次 插入10条数据,程序运行耗时:
13824979

策略模式第7次 插入10条数据,程序运行耗时:
14306067

策略模式第8次 插入10条数据,程序运行耗时:
16415564

策略模式第9次 插入10条数据,程序运行耗时:
13572702

策略模式第10次 插入10条数据,程序运行耗时:
13571828

策略模式第11次 插入10条数据,程序运行耗时:
13798897

策略模式第12次 插入10条数据,程序运行耗时:
14894078

策略模式第13次 插入10条数据,程序运行耗时:
13607394

策略模式第14次 插入10条数据,程序运行耗时:
13967062

策略模式第15次 插入10条数据,程序运行耗时:
14625442



静态反射第1次 插入10条数据,程序运行耗时:
21599266

静态反射第2次 插入10条数据,程序运行耗时:
16478487

静态反射第3次 插入10条数据,程序运行耗时:
14593340

静态反射第4次 插入10条数据,程序运行耗时:
15976455

静态反射第5次 插入10条数据,程序运行耗时:
13981077

静态反射第6次 插入10条数据,程序运行耗时:
16031862

静态反射第7次 插入10条数据,程序运行耗时:
19986908

静态反射第8次 插入10条数据,程序运行耗时:
16614291

静态反射第9次 插入10条数据,程序运行耗时:
26047964

静态反射第10次 插入10条数据,程序运行耗时:
15660924

静态反射第11次 插入10条数据,程序运行耗时:
18112492

静态反射第12次 插入10条数据,程序运行耗时:
15651340

静态反射第13次 插入10条数据,程序运行耗时:
14652823

静态反射第14次 插入10条数据,程序运行耗时:
17635581

静态反射第15次 插入10条数据,程序运行耗时:
18890318

大家可以看到,结果差不多。这下不好选择了,使用哪个呢?我是还没想好。

两个方式的代码在这里下载~

注:代码是两天前传的,这里贴的代码是后来修改过的,改了几个类名,没其他变化~

posted on 2008-06-25 09:30  张少峰  阅读(652)  评论(0编辑  收藏  举报

导航