mysql odbc ado性能差异_ODBC、OLEDB和ADO之间的关系 ,以及性能比较
学习了.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之间的关系 ,以及性能比较相关推荐
- mysql、orcl中database、schema、user之间的关系
对于MySQL而言,"database 数据库" 和 "schema 模式" 是同一件事.具体区分如下表: In MySQL: server instance ...
- day 1 学习MySQL数据库作业 - 创建员工表思考与表之间的关系
day 1 学习MySQL数据库作业 创建员工表 (工号.姓名.性别.出生日期.入职日期.月薪.职位) 思考员工表跟部门表之间有没有关系?如果有是什么关系?如何建立两张表的关系? 1.创建员工表 (工 ...
- mysql中通过外键创建表与表之间的关系
写个学生表(主表)和成绩表(从表),他们之间的关系是一对多,在从表中创建个字段并把它指定为外键与主表中的主键关联起来. 创建学生表 create table student(id int primar ...
- PostgreSQL 和 MySQL 之间的性能差异
导读:在本文中,我们将讨论工作负载分析和运行查询,一起了解两个数据库系统在 JSON.索引和并发方面的性能差异. 简介 在管理数据库时,性能是一项非常重要而又复杂的任务.它可能会受到系统的配置.硬件甚 ...
- 从一个真实案例看性能差异问题处理方法论
墨墨导读:本文来自墨天轮用户"取名浪费我半小时"投稿,个人主页:https://www.modb.pro/u/397063. 数据技术嘉年华,十周年盛大开启,点我立即报名!大会以& ...
- mysql的ole db 访问接口msdasql的数据源对象_数据库访问接口(ODBC,OLEDB,ADO)
目录 数据库访问接口发展历史 ODBC历史 ODBC(Open Database Connectivity,开放数据库互连).要了解ODBC是什么,先了解一下数据库连接的相关知识.在最开始连接数据库时 ...
- mysql+odbc+ado_MFC ado+mysql+odbc技术分享
第一步:建立数据库 假设有一个sql文件 mysql>use dbname; //创建一个数据库名为dbname的数据库(空数据库) mysql>set ...
- ODBC、OLEDB、ADO的区别和联系
ODBC 是一种底层的访问技术,因此,ODBC API可以是客户应用程序能从底层设置和控制数据库,完成一些高级数据库技术无法完成的功能:但不足之处由于ODBC只能用于关系型数据库,使得利用ODBC很难 ...
- ODBC、OLEDB、ADO
相信看到这篇文章的人,心中肯定有这样的想法:ODBC.OLEDB.ADO.ADO.NET貌似都是访问数据库的东东,那么他们之间有什么区别,又有什么联系呢?不要着急,待我慢慢道来. 一.ODBC ODB ...
最新文章
- C++面试宝典2011
- 面板没了_LCD面板疯狂涨价 白菜价的55寸4K电视没了
- 划船训练常见错误:含胸驼背肩胛骨活动不足
- CRM, C4C和Hybris的工作流简介
- 【bzoj3744】Gty的妹子序列 分块+树状数组+主席树
- 2019年终总结与新年重磅福利
- Android--获取App应用程序的大小
- web服务器一些概念
- 算法设计与分析第六章习题解答与学习指导(第2版)屈婉婷 刘田 张立昂 王捍贫编著 清华大学出版社
- 基于51单片机的电子时钟
- 利用adsl拨号服务器VPS构建代理IP池
- 阿里云跨账号迁移云服务器实例
- 工业农业消防自动检测及报警云方案
- 关于cv::warpaffine函数
- Java基本语法——数组
- WIN Vista系统汇总!!![讯雷下载]
- 问题 A: 找x--《算法笔记》
- 第三章可再生和可耗竭资源
- 腾讯竟然又偷偷开源了一套Android原生UI框架!不吃透都对不起自己
- Android拦截电话
热门文章
- 小型Hadoop集群的Ganglia配置和一些故障排除
- Java EE 7:带有Glassfish v4的JMS 2.0
- JMX和Spring –第1部分
- 为什么在2012/2013年我将在新的Enterprise Java项目中继续使用Spring *和* Java EE
- JDBC连接Oracle数据库的参数配置
- 量子计算机是否存在相对论,潘建伟团队再登Science:寻找广义相对论与量子力学的桥梁...
- android 单元测试 多线程,单元测试多线程Android RxJava
- 【Android OpenGL ES 开发 (三)】Shader 扩展
- python apply_async函数_进程池未执行apply_async中添加的函数就直接结束了
- linux 查看日志_干货 | 名企高频考点之谈谈Linux日志查看方式都有哪些