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

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

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

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

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

第一次:

第二次:

第三次:

在关闭连接的情况下 : 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

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

www.connectionstrings.com

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

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

@MISS BingBing

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

时间: 2024-10-06 01:31:34

OLEDB 连接 和 效率(MS SQL 、Oracle 、ACESS)的相关文章

SSIS 从oracle 转数据回MS SQL

SSIS 从oracle 转数据回MS SQL,转每月的销售记录,大概15000以内,在开发机器上没问题,部署到生产环境出现各种状况“ SSIS 无法从连接伺服器的OLE DB提供者BULK 提取资料列 ”,其他表几万的记录都没有问题,将销售记录整理为视图,问题依旧.猜测是否这个表有问题,将视图中数据做排序处理,居然将问题解决了,不知那位大神可以解释一下这个是什么状况?

Oracle\MS SQL Server Update多表关联更新

原文:Oracle\MS SQL Server Update多表关联更新 一条Update更新语句是不能更新多张表的,除非使用触发器隐含更新.而表的更新操作中,在很多情况下需要在表达式中引用要更新的表以外的数据.我们先来讨论根据其他表数据更新你要更新的表   一.MS    SQL    Server   多表关联更新      sql server提供了update的from 子句,可以将要更新的表与其它的数据源连接起来.虽然只能对一个表进行更新,但是通过将要更新的表与其它的数据源连接起来,就

php5.3.x连接MS SQL server2008

开篇 因为毕设老师需求的原因,虚拟旅游网站要求的数据库必须使用MS SQL server. 我最擅长的web编程语言是PHP,但是在PHP中链接MS SQL server是一件非常麻烦的事,我个人分析造成这种麻烦的原因:是因为使用PHP的一大优点就是免费,然而MS SQL server虽然图形化界面操作起来简单,但是其昂贵的授权费让人望而却步:加之MySQL不俗的性能和强大的社区支持,使得真正企业环境里,使用PHP + MS SQL server的人越来越少. 其实纵观网上的文章,之所以有人选择

不能连接MS Sql Server2008数据库的问题

前几天在计算机上安装了Win8企业版,又安装了MS Sql Server2008,本地开发比较顺畅,可是别的计算机的客户端却不能访问数据库. 先Ping一下,不通,可是它却能ping通别的计算机,可能是设置问题: 1.在运行里输入gpedit.msc,或者进入管理工具,找到计算机设置->windows设置->安全设置->本地策略->用户权限分配->拒绝从网络访问此计算机->删除guest用户,确定.(没有解决问题) 2.打开控制面板,进入管理工具,打开guest账户,G

MS SQL 模仿ORACLE的DESC

前言: 在ORACLE数据库的SQL*PLUS里面有个DES(DESCRIBE)命令,它可以返回数据库所存储对象的描述,如下所示 SQL> DESC STUDENT_SCORE   Name Type Nullable Default Comments   ---------------- ---------- -------- ------- --------   STUDENT_NO NUMBER(10) 学号   CHINESE_SCORE NUMBER Y 语文成绩   ENGLISH_

iBatis自动生成的主键 (Oracle,MS Sql Server,MySQL)【转】

iBatis的sqlMap配置文件的selectKey元素有个type属性,可以指定pre或者post表示前生成(pre)还是后生成(post). Oracle设置 Xml代码   <!-- Oracle SEQUENCE --> <insert id="insertProduct-ORACLE" parameterClass="com.domain.Product"> <selectKey resultClass="int&

MS SQL到Oracle的数据迁移笔记

MS SQL到Oracle的数据迁移笔记 一.任务背景 旧系统使用MS SQL Server数据库,新系统使用Oracle数据库,现在需要将旧系统中的数据迁移到新系统中,旧数据按照约定的规则转换后,能够在新系统中使用或查询.另外,新系统的实施人员并不清楚旧系统的数据结构,且两个新旧两个系统的使用的数据结构有较大的差异.为了叙述方便,将旧系统维护人员简称为A,新系统实施人员简称为B. 二.总体思路 1.  A与B根据各自了解的信息,一起制定中间表: 2.  A从MS SQL Server提取数据,

MS SQL语句优化

MS SQL Server查询优化方法查询速度慢的原因很多,常见如下几种 1.没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设计的缺陷) 2.I/O吞吐量小,形成了瓶颈效应. 3.没有创建计算列导致查询不优化. 4.内存不足 5.网络速度慢 6.查询出的数据量过大(可以采用多次查询,其他的方法降低数据量) 7.锁或者死锁(这也是查询慢最常见的问题,是程序设计的缺陷) 8.sp_lock,sp_who,活动的用户查看,原因是读写竞争资源. 9.返回了不必要的行和列 10.查询语句不好,没

MS Sql优化(转自网络)

MS SQL Server查询优化方法查询速度慢的原因很多,常见如下几种 1.没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设计的缺陷) 2.I/O吞吐量小,形成了瓶颈效应. 3.没有创建计算列导致查询不优化. 4.内存不足 5.网络速度慢 6.查询出的数据量过大(可以采用多次查询,其他的方法降低数据量) 7.锁或者死锁(这也是查询慢最常见的问题,是程序设计的缺陷) 8.sp_lock,sp_who,活动的用户查看,原因是读写竞争资源. 9.返回了不必要的行和列 10.查询语句不好,没