您的位置:首页 > 博客中心 > 数据库 >

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

时间:2022-03-14 06:05

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

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

技术分享

本文的小工具和封装类,已经提交到了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();

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

第一次:  

技术分享

第二次:

技术分享

 

第三次:

技术分享

 

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

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

 

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

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

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

技术分享

第二次:

技术分享

 第三次:

技术分享

可能看到同事们纷纷离开工位,回家过年了,电脑也激动地越来越卡了,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

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

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

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

技术分享

@MISS BingBing

 

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

本类排行

今日推荐

热门手游