学习了.net视频之后,对里面涉及到的数据库连接部分中的一些概念表示很无语。网上很多相关资料,但除了网站不一样外,基本上内容都神一样的一致。

现在,我就通过结合看到的一些资料再加上自己的理解试图去解释一下,有不对的,还请大家指教!

看一张图:

看图中右半部分,我们先来了解一下ODBC这个概念。

1.ODBC:

要了解ODBC是什么,先了解一下数据库连接的相关知识。其实,在最开始连接数据库时,由于数据库种类繁多,各种数据库连接有不同的需求,这个时期,数据库连接主要依靠各种API函数来进行连接。而ODBC就是将这些API函数封装起来形成统一的接口如上图所示(ODBC上方有一个唯一的接口)。图中所示的ODBC层代表ODBC中各种数据库的驱动器(driver),当SQL语句进入接口后,驱动器管理程序通过辨别将它们分别对应的进入各自的驱动器(driver),由驱动器来讲SQL语句送入各种不同的数据库。

不知道上面这样写,有没有把这个ODBC给介绍的明白一点儿,学习要生活化,这样才容易理解。我来举个例子。

我们把ODBC假想成一辆汽车,汽车中有一名司机(driver),把下面的各种数据库假设程不同的工厂。如果司机接收到接口中的命令(SQL语句)——将汽车上的货物运到某个工厂中。那么司机(driver)会根据命令中所指明的货物的类型,自己去辨别到底应该进入哪个工厂才能完成任务。

大家看,上面这个例子中接收的命令就好像是数据库中的SQL语句,那么司机就好像是驱动器(driver),而不同的工厂就好像是不同种类的数据库。这样理解,有没有简单一点儿呢?

2.OLEDB与ODBC

好了,再来看一下OLEDB,在上面的例子中我们理解了ODBC,还有我们必须知道,ODBC负责的只是结构化数据库的连接。这样我们就会比较容易理解OLEDB。

OLEDB其实和ODBC类似,都是负责数据库连接的低级接口。而OLEDB不仅支持结构化数据库如SQL server,Oracel Access等,而且还支持非结构化数据源的连接如EXCEL等。

OLEDB(对象连接和嵌入数据库),是一组对象的集合,一种读写数据的方法。在使用OLEDB时,使用步骤为:初始化OLE、连接到数据源、发出命令、处理结果、释放数据源对象并停止初始化OLE。他可以通过ODBC连接到数据库,也可以之间连接到数据库。当不通过ODBC时,这时在这其中并不涉及到驱动器的成分,因此,此时的数据库连接速度会更快。同时,我们可以知道,只要支持ODBC的数据源是一定能够支持OLEDB的。但是反过来则不一定。

3.ADO

通过图中,我们看到ADO是位于应用程序和OLEDB之间的。它属于数据库连接中的高层接口。

是一个用于存取数据源的COM组件。它提供了编程语言和统一数据访问方式OLE DB的一个中间层。允许开发人员编写访问数据的代码而不用关心数据库是如何实现的,而只用关心到数据库的连接。访问数据库的时候,关于SQL的知识不是必要的,但是特定数据库支持的SQL命令仍可以通过ADO中的命令对象来执行。

如何理解上面这个概念呢?其实我们可以联系我们学到的关于ADO控件的相关知识。在原来学习VB的时候,我们如果想要连接到数据库的话,必须加载一个引用空间,里面含有connection,command,recordset等一些相关数据库连接的对象,其实这个引用就是ADO。我们通过这些对象建立对数据库的连接,我们只需编写访问数据库的代码,而并不用关系数据库是如何实现的。

看完了三者的关系,让我们来看看他们操作数据的速度如何,以打开access为例

性能对比:

sql access

oledb dsn oledb dsn

时间      18 82 62 99

查询1,000条记录: 100 150 2900 5400

显然,oledb链接方式相对于dsn有很大的优势.购买虚拟主机的小站,大多是php+mysql或者asp+access的组合,一般没有dsn数据源的配置,而且我们也不需要.同时mssql是一种昂贵的数据库,如果使用效率低下的access,我们应该尽量的减少数据库引擎的压力.我经常看见一些站点给出提示:数据库连接失败,显然,又是access出毛病了.

常用的连接access的办法:

oledb

openstr="provider=microsoft.jet.oledb.4.0;" & "data source = " & server.mappath(db)

odbc

openstr="Driver={Microsoft Access Driver (*.mdb)};DBQ=" &Server.Mappath(db)

这两者在性能上也有一定的差别.下面是一个测试文件,对两者进行比较.

dim openmode,action,db,openstr,rs,conn

openmode=request.QueryString("openmode")

action=request.QueryString("action")

db="#niceidea.mdb"

set conn=server.createobject("adodb.connection")

if penmode="oledb" then penstr="provider=microsoft.jet.oledb.4.0;" & "data source = " & server.mappath(db)

if penmode="odbc" then penstr="Driver={Microsoft Access Driver (*.mdb)};DBQ=" &Server.Mappath(db)

Dim strStartTime

Dim strEndTime

strStartTime = Timer ''''''''''''''''''''''''''''''''开始时间

''''''''''''''''''''''''''''''''反复打开数据库50次

if action="open" then

for i=1 to 50

conn.open(openstr)

conn.close

next

set conn=nothing

end if

''''''''''''''''''''''''''''''''移动记录集10000次

if action="move" then

conn.open(openstr)

set rs=conn.execute("select * from visitor")

for i=1 to 10000

rs.movenext

next

rs.close

set rs=nothing

conn.close

set conn=nothing

end if

''''''''''''''''''''''''''''''''反复打开记录集1000次

if action="getrs" then

conn.open(openstr)

set rs=server.CreateObject("adodb.recordset")

dim sqlstr

sqlstr="select * from visitor"

for i=1 to 1000

rs.open sqlstr,conn,1,1

rs.close

next

set rs=nothing

conn.close

set conn=nothing

end if

%>

'''''''''''''''''''''''''''''''' 加载完毕的时间

strEndTime = Timer

Response.Write ("运行处理时间: ")

Response.Write 1000*(strEndTime - strStartTime)

Response.Write (" 毫秒.")

response.end

%>

得到的数据如下:

odbc反复打开数据库50次:

6062.5 毫秒.

oledb反复打开数据库50次:

4601.563毫秒.

odbc移动记录集10000次:

1132.813 毫秒.

oledb移动记录集10000次:

304.6875 毫秒.

odbc反复打开记录集1000次:

8734.375 毫秒.

oledb反复打开记录集1000次:

7960.938 毫秒.

测试环境,ce1.70/512m/windows xp sp2/withnetbox(不再开发的测试服务器)

显然,在效率上,oledb有些微的优势。微软已经不更新ODBC,用JET方式连接数据库是一种更有效率的办法,特别是在需要移动游标的时候.另外,两者还有一些其他方面的区别,oledb是一种更底层的方法,在这种数据库连接方式中,应该注意的规范更多,就像用sql和access时候,某些查询语句也会不一样.例如:

select from user where id=1

将是一句错误的查询语句,因为user是系统保留的关键字.需要改为

select from [user] where id=1

如果使用odbc连接,则不存在上述情况.

如果使用jet连接,在某些虚拟主机中可能会因为access版本的不同而导致连接失败;所以你需要首先确定主机的引擎版本;在尽可能的情况下,使用以下语句打开access,将提高asp的效率,还有稳定性:

"provider=microsoft.jet.oledb.4.0;" & "data source = " & server.mappath(db)

此外,打开数据库和记录集对象都是很消耗cpu资源的,尽可能减少查询是很必要的

mysql odbc ado性能差异_ODBC、OLEDB和ADO之间的关系 ,以及性能比较相关推荐

  1. mysql、orcl中database、schema、user之间的关系

    对于MySQL而言,"database 数据库" 和 "schema 模式" 是同一件事.具体区分如下表: In MySQL: server instance ...

  2. day 1 学习MySQL数据库作业 - 创建员工表思考与表之间的关系

    day 1 学习MySQL数据库作业 创建员工表 (工号.姓名.性别.出生日期.入职日期.月薪.职位) 思考员工表跟部门表之间有没有关系?如果有是什么关系?如何建立两张表的关系? 1.创建员工表 (工 ...

  3. mysql中通过外键创建表与表之间的关系

    写个学生表(主表)和成绩表(从表),他们之间的关系是一对多,在从表中创建个字段并把它指定为外键与主表中的主键关联起来. 创建学生表 create table student(id int primar ...

  4. PostgreSQL 和 MySQL 之间的性能差异

    导读:在本文中,我们将讨论工作负载分析和运行查询,一起了解两个数据库系统在 JSON.索引和并发方面的性能差异. 简介 在管理数据库时,性能是一项非常重要而又复杂的任务.它可能会受到系统的配置.硬件甚 ...

  5. 从一个真实案例看性能差异问题处理方法论

    墨墨导读:本文来自墨天轮用户"取名浪费我半小时"投稿,个人主页:https://www.modb.pro/u/397063. 数据技术嘉年华,十周年盛大开启,点我立即报名!大会以& ...

  6. mysql的ole db 访问接口msdasql的数据源对象_数据库访问接口(ODBC,OLEDB,ADO)

    目录 数据库访问接口发展历史 ODBC历史 ODBC(Open Database Connectivity,开放数据库互连).要了解ODBC是什么,先了解一下数据库连接的相关知识.在最开始连接数据库时 ...

  7. mysql+odbc+ado_MFC ado+mysql+odbc技术分享

    第一步:建立数据库 假设有一个sql文件 mysql>use dbname;                   //创建一个数据库名为dbname的数据库(空数据库) mysql>set ...

  8. ODBC、OLEDB、ADO的区别和联系

    ODBC 是一种底层的访问技术,因此,ODBC API可以是客户应用程序能从底层设置和控制数据库,完成一些高级数据库技术无法完成的功能:但不足之处由于ODBC只能用于关系型数据库,使得利用ODBC很难 ...

  9. ODBC、OLEDB、ADO

    相信看到这篇文章的人,心中肯定有这样的想法:ODBC.OLEDB.ADO.ADO.NET貌似都是访问数据库的东东,那么他们之间有什么区别,又有什么联系呢?不要着急,待我慢慢道来. 一.ODBC ODB ...

最新文章

  1. C++面试宝典2011
  2. 面板没了_LCD面板疯狂涨价 白菜价的55寸4K电视没了
  3. 划船训练常见错误:含胸驼背肩胛骨活动不足
  4. CRM, C4C和Hybris的工作流简介
  5. 【bzoj3744】Gty的妹子序列 分块+树状数组+主席树
  6. 2019年终总结与新年重磅福利
  7. Android--获取App应用程序的大小
  8. web服务器一些概念
  9. 算法设计与分析第六章习题解答与学习指导(第2版)屈婉婷 刘田 张立昂 王捍贫编著 清华大学出版社
  10. 基于51单片机的电子时钟
  11. 利用adsl拨号服务器VPS构建代理IP池
  12. 阿里云跨账号迁移云服务器实例
  13. 工业农业消防自动检测及报警云方案
  14. 关于cv::warpaffine函数
  15. Java基本语法——数组
  16. WIN Vista系统汇总!!![讯雷下载]
  17. 问题 A: 找x--《算法笔记》
  18. 第三章可再生和可耗竭资源
  19. 腾讯竟然又偷偷开源了一套Android原生UI框架!不吃透都对不起自己
  20. Android拦截电话

热门文章

  1. 小型Hadoop集群的Ganglia配置和一些故障排除
  2. Java EE 7:带有Glassfish v4的JMS 2.0
  3. JMX和Spring –第1部分
  4. 为什么在2012/2013年我将在新的Enterprise Java项目中继续使用Spring *和* Java EE
  5. JDBC连接Oracle数据库的参数配置
  6. 量子计算机是否存在相对论,潘建伟团队再登Science:寻找广义相对论与量子力学的桥梁...
  7. android 单元测试 多线程,单元测试多线程Android RxJava
  8. 【Android OpenGL ES 开发 (三)】Shader 扩展
  9. python apply_async函数_进程池未执行apply_async中添加的函数就直接结束了
  10. linux 查看日志_干货 | 名企高频考点之谈谈Linux日志查看方式都有哪些