OLEDB 连接 和 效率(MS SQL 、Oracle 、ACESS)

       这半年手头的一个项目,自己写代码的时候偏爱 MS SQL、部署服务器装的是 ORALCE 和 实际的现场是小型机,压根没有装数据库只好选用 ACESS ,三种环境不一致,才决定用 OLEDB 做数据库访问。之前忙于赶进度草草地封了几个增删改查的操作,年前闲下来做测试还发现了不少问题。趁着这几天闲就从头封装了一次,做出单独的一个简单类出来。

为了调用的时候传递方便就直接从 IDbCommand 继承过来,这样传参还是调用都留下了余地,封装很简单直接上类图

110859_FBNw_559187.png

本文的小工具和封装类,已经提交到了GIT

Toater_OSC Git 中的 DataBaseAcess 工程里

这个版本的封装提供了俩个简单的选项

1.是否保持连接

执行命令后是否关闭连接的选项,因为发现在使用 ACESS 的时候如果频繁打开关闭文件,指不定就会遇到 IO导致的错误,下面来由一组测试来说明 ACESS 在保持连接的情况下执行效率竟然超过了俩种主流数据库。

2. 数据库类型选择

/// <summary>
/// /// <summary>
/// 构造函数
/// </summary>
/// <param name="connectionString">连接字符串</param>
/// <param name="dbType">数据库类型</param>
/// <param name="keepAlive">是否保持连接</param>
public DBFairy(string connectionString, string dbType = DBType_Oracle, bool keepAlive = false)
{
 // 非默认值检查关键字匹配
 if (!string.IsNullOrEmpty(dbType))
 {
  if (DBType_Oracle != dbType && DBType_MSSQL != dbType && DBType_ACCESS != dbType)
  {
   throw new NotSupportedException("不受支持的类型描述,请使用 DBFairy.DBType 定义.");
  }
  _DBType = dbType;
 }

 _ConnectionString = connectionString;
 _AlwaysClose = !keepAlive;
 dbCommand.Connection = new OleDbConnection(_ConnectionString);
}

测试了支持选项中的三种数据库,下面是测试过程。

环境是  :   Acer 台式机 ,I3 CPU ,4G 内存

方法是 : 三个后台线程,同时执行 数据库操作

不过我还是很偏心地把 ACCESS 地调用放在了第一位,实在是因为大家都说小伙子太慢,才爱心地放在了第一位。

bgAcessWorker.RunWorkerAsync();
bgMSWorker.RunWorkerAsync();
bgOracleWorker.RunWorkerAsync();

在关闭连接的情况下的三次测试:

第一次:  

111332_2UIs_559187.png

第二次:

111454_ytGo_559187.png

 

第三次:

111701_6IG4_559187.png

 

在关闭连接的情况下 : MS SQL 和 Oracle 相差无几,不过感觉上还是 ORACLE 略快, ACESS 操作时间基本在 2倍以上

问题 : 为毛 ACCESS 执行越来越快了?难道这是文件 IO 缓存的问题,或者进程调度优先了文件?

 

 在保持连接状态下的三组测试:

第一次 : MSSQL和ORACLE基本还好之前的相差无几的感觉,不过可以看出来,这里的时间已经从 17000 减少到了 15000 ,不过在服务型的数据上,开关连接的损失不是很大。

再看一下 ACESS 明显已经逆天了,直接秒杀了俩位老大。只用了10075 ,10秒左右插入了 1000 条记录。

112011_CvoF_559187.png

第二次:

112449_y4ZE_559187.png

 第三次:

112527_a1HT_559187.png

可能看到同事们纷纷离开工位,回家过年了,电脑也激动地越来越卡了,1000行的执行时间越来越长,不过对比结果还是很明显的.

ACESS 在保持连接的状态下,小量数据的插入速度还是很快的,赶超过了 MS SQL 和 ORACLE 。后俩者一直很默契,不离不弃地保持着不分不舍的步调。

(估计是今天情人节的原因吧 ^_^)

----------------------------------------------------------- MARK ----------------------------------------------------------------

 ------ MS SQL 这里用的附加数据库 ,VS 2013 自带了 虚拟 SQL的功能
<add name="OLEDBConnectionString"
 connectionString="Provider=SQLNCLI11.1;Data Source=(LocalDB)\V11.0;Persist Security Info=False;Integrated Security=SSPI;Initial File Name=E:\OSChina\Source\Repos\Thenu.TinyHourseLib\THenu.TinyHourseLib\DataBaseAcess\WindowsFormsAcess\App_Data\StudentDB.mdf"
 providerName="System.Data.OleDb" />
 --- ORACL 
<add name="OracleConnectionString"
 connectionString="Provider=MSDAORA.1;Data Source=orcl;Persist Security Info=True;Password=hhkj;User ID=hhkj"
 providerName="System.Data.OleDb" />
 --- ACESS
<add name="AccessConnectionString"
 connectionString="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=E:\OSChina\Source\Repos\Thenu.TinyHourseLib\THenu.TinyHourseLib\DataBaseAcess\WindowsFormsAcess\App_Data\Student.mdb"
 providerName="System.Data.OleDb" />

关于连接字符串,大家跟据自己的版本,选择好  Provider , SQL 2005,2008 和 2012 使用不同的,而且对于服务数据和附加数据库也有一点区别。Oracle 的常用的就是上面的方式,当然也可以选择 Oralce 自己的OLEDB Provider

给大家推荐一个很全的连接字符串参考网站:

www.connectionstrings.com

问题汇总部分实在来不及写了, 不要骂我是骗子,着急中午回家洗袜子 就这一双明天早上还要穿的,这部分年后再补录吧

今天是情人节外加回家的大日子,作为资深屌丝也是有很多正事要做的  

122407_3NWE_559187.png

@MISS BingBing

 

各位OSCer 新年快乐,羊年吉祥,喜洋洋、美羊羊、懒洋洋,我是灰太狼。。。。

转载于:https://my.oschina.net/HenuToater/blog/378600

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值