几种数据库连接方式优缺点比较
访问接口 |
易用性 |
运行能力 |
可扩展性 |
技术层次 |
突出特点 |
ODBC |
差 |
较高 |
差 |
底层 |
可进行底层控制 |
MFC ODBC |
好 |
|
一般 |
高层 |
同用标准,应用广泛 |
MFC DAO |
好 |
较高 |
一般 |
高层 |
访问JET性能最好 |
OLE DB |
很难 |
高 |
好 |
底层 |
可访问非关系型数据库 |
ADO |
最好 |
高 |
好 |
高层 |
可访问非关系型数据库,有多种编程接口 |
ODBC 是一种底层的访问技术,因此,ODBC API 可以是客户应用程序能从底层设置和控制数据库,完成一些高级数据库技术无法完成的功能;但不足之处由于ODBC只能用于关系型数据库,使得利用ODBC很难访问对象数据库及其他非关系数据库。
DAO 提供了一种通过程序代码创建和操纵数据库的机制。最大特点是对MICROSOFT JET数据库的操作很方便,而且是操作JET数据库时性能最好的技术接口之一。并且它并不只能用于访问这种数据库,事实上,通过DAO技术可以访问从文本文件到大型后台数据库等多种数据格式。
ADO 是基于OLE DB的访问接口,它是面向对象的OLE DB技术,继承了OLE DB的优点。属于数据库访问的高层接口。
在速度上ADO 〉DAO 〉ODBC , 综合评定ADO,ODBC,DAO
ODBC是Microsoft的基于关系数据库一种互连技术,它只能访问关系数据库,如果使用SQLAPI进行编程,效率较好,但代码较多,如果使用MFC ODBC封装的类进行访问比较简单。
ADO是一种基于COM的数据库访问技术,可以访问关系数据库与非关系数据库,由于它是基于COM的,访问速度也较快,占用资源较小。
DAO是Microsoft一种用来访问Jet引擎的方法,主要用来访问Access数据库,使用起来比较简单。
1.3.1 数据库的连接方式
1. ODBC数据库接口
ODBC即开放式数据库互连(Open Database Connectivity),是微软公司推出的一种实现应用程序和关系数据库之间通讯的接口标准。符合标准的数据库就可以通过SQL语言编写的命令对数据 库进行操作,但只针对关系数据库。目前所有的关系数据库都符合该标准(如SQL Server,Oracle,Access,Excel等)。ODBC本质上是一组数据库访问API(应用程序编程接口),由一组函数调用组成,核心是SQL语句,其结构如图1.8所示:
图 1.8 ODBC数据库接口
2. OLE DB数据库接口
OLE DB即数据库链接和嵌入对象(Object Linking and Embedding DataBase)。OLE DB是微软提出的基于COM思想且面向对象的一种技术标准,目的是提供一种统一的数据访问接口访问各种数据源,这里所说的“数据”除了标准的关系型数据库 中的数据之外,还包括邮件数据、Web上的文本或图形、目录服务(DirectoryServices)、以及主机系统中的文件和地理数据以及自定义业务 对象等。OLE DB标准的核心内容就是提供一种相同的访问接口,使得数据的使用者(应用程序)可以使用同样的方法访问各种数据,而不用考虑数据的具体存储地点、格式或类型,其结构图如图1.9所示:
图1.9 OLE DB数据库接口
3. ADO数据库接口
ADO(ActiveX Data Objects)是微软公司开发的基于COM的数据库应用程序接口,通过ADO连接数据库,可以灵活地操作数据库中的数据。
图1.10展示了应用程序通过ADO访问SQL Server数据库接口。从图中可看出,使用ADO访问SQL Server数据库有两种途径:一种是通过ODBC驱动程序,另一种是通过SQL Server专用的OLE DBProvider,后者有更高的访问效率。
图1.10 ADO访问SQLServer的接口
4. ADO.NET数据库接口
ASP.Net 使用 ADO.NET 数据模型。该模型从ADO 发展而来,但它不只是对 ADO的改进,而是采用了一种全新的技术。主要表现在以下几个方面:
● ADO.NET 不是采用ActiveX 技术,而是与.NET框架紧密结合的产物。
● ADO.NET 包含对 XML标准的完全支持,这对于跨平台交换数据具有重要的意义。
● ADO.NET 既能在与数据源连接的环境下工作,又能在断开与数据源连接的条件下工作。特别是后者,非常适合于网络应用的需要。因为在网络环境下,保持与数据源连接,不符合网站的要求,不仅效率低,付出的代价高,而且常常会引发由于多个用户同时访问时带来的冲突。因此 ADO.NET 系统集中主要精力用于解决在断开与数据源连接的条件下数据处理的问题。
ADO.NET 提供了面向对象的数据库视图,并且在 ADO.NET 对象中封装了许多数据库属性和关系。最重要的是,ADO.NET 通过很多方式封装和隐藏了很多数据库访问的细节。可以完全不知道对象在与 ADO.NET 对象交互,也不用担心数据移动到另外一个数据库或者从另一个数据库获得数据的细节问题。如图1.11显示了 ADO.NET架构总览。
图1.11 通过ADO.NET访问数据库的接口模型
5. JDBC数据库接口
JDBC(Java Data Base Connectivity)是Java Soft公司开发的,一组Java语言编写的用于数据库连接和操作的类和接口,可为多种关系数据库提供统一的访问方式。通过JDBC完成对数据库的访问包括四个主要组件:Java应用程序、JDBC驱动器管理器、驱动器和数据源。
在JDBC?API中有两层接口:应用程序层和驱动程序层,前者使开发人员可以通过SQL调用数据库和取得结果,后者处理与具体数据库驱动程序的所有通讯。
使用JDBC接口对数据库操作有如下优点:
(1).JDBC?API与ODBC十分相似,有利于用户理解;
(2)使编程人员从复杂的驱动器调用命令和函数中解脱出来,而致力于应用程序功能的实现;
(3)JDBC支持不同的关系数据库,增强了程序的可移植性。
使用JDBC的主要缺点:访问数据记录的速度会受到一定影响,此外,由于JDBC结构中包含了不同厂家的产品,这给数据源的更改带来了较大麻烦。
4. 数据库连接池技术
对于网络环境下的数据库应用,由于用户众多,使用传统的JDBC方式进行数据库连接,系统资源开销过大成为制约大型企业级应用效率的瓶颈,采用数据库连接池技术对数据库连接进行管理,可以大大提高系统的效率和稳定性。
1.3.2 客户/服务器(C/S)模式应用系统
Microsoft公司开发的SQL Server数据库管理系统当前最流行的版本仍然是SQL Server2000,本书介绍SQL Server2000。
数据库管理系统通过命令和适合专业人员的界面操作数据库。对于SQL Server2000数据库管理系统,用户在SQL Server 2000的查询分析器中输入SQL命令,系统执行的结果返回到查询分析器上显示。用户可以直接通过SQL Server 2000的企业管理器的界面操作数据库。
图1.12 数据库应用程序与数据库、数据库管理系统之间的关系
1.3.3 三层客户/服务器(B/S)模式应用系统
基于Web的数据库应用采用三层客户/服务器模式,也称B/S结构。第一层为浏览器,第二层为Web服务器,第三层为数据库服务器。 浏览器是用户输入数据和显示结果的交互界面,用户在浏览器表单中输入数据,然后将表单中的数据提交并发送到Web服务器,Web服务器应用程序接受并处理 用户的数据,通过数据库服务器,从数据库中查询需要的数据(或把数据录入数据库)送Web服务器,Web服务器把返回的结果插入HTML页面,传送到客户 端,在浏览器中显示出来。如图1.13所示。
Java连接数据库的方式有多种:根据所需要的不同数据库驱动分,分为四种:
1:1类驱动。这就是JDBC-ODBC桥的方式。
但这种方式不适合程序的重用与维护,不推荐使用。需要数据库的ODBC驱动。
2:2类驱动。这就是JDBC+厂商API的形式。
厂商API一般使用C编写,所以,这种方式也不长使用。
3:3类驱动。这就是JDBC+厂商Database Connection Server+DataBase的形式。
这种方法就是在JAVA 与 DATABASE之间价起了一台专门用与数据库连接的服务器(一般由数据库厂商提供)。
他的好处在于能优化连接。
4:4类驱动。这就是纯JDBC+DATABASE的连接方式。也是推荐的连接方式。
这使得APPLICATION与数据库分开,开发者只需关心内部逻辑的实现而不需注重数据库连接的具体实现。
在这其中有两种连接的方式:硬编码方式,就是在程序中硬性编入数据库连接的所须参数。
JNDI DataSource方式。就是在程序运行的外布环境中又称(Context)设置一个datasource数据源,有一个jndi 名称,程序只须查找此名称就可得到一个数据库连接的对象。
Type 1: jdbc-odbc桥 Jdbc-odbc 桥 是sun公司提供的,是jdk提供的的标准api.
这种类型的驱动实际是把所有 jdbc的调用传递给odbc ,再由odbc调用本地数据库驱动代码.( 本地数据库驱动代码是指 由数据库厂商提供的数据库操作二进制代码库,例如在Oracle for windows中就是oci dll 文 件)
只要本地机装有相关的odbc驱动那么采用jdbc-odbc桥几乎可以访问所有的数据库,jdbc- odbc方法对于客户端已经具备odbc driver的应用还是可行的。
但是,由于jdbc-odbc先调用 odbc再由odbc去调用本地数据库接口访问数据库.所以,执行效率比较低,对于那些大数据量 存取的应用是不适合的.
而且,这种方法要求客户端必须安装odbc 驱动,所以对于基于 internet ,intranet的应用也是不合适的.因为,你不可能要求所有客户都能找到odbc driver.
=====一般ACCESS用到的比较多,初学者用。实际项目是不用的
Type 2: 本地Api驱动
本地api驱动直接把jdbc调用转变为数据库的标准调用再去访问数据库。
这种方法需要本地 数据库驱动代码. 本地api驱动|厂商DB代码---数据库Server这种驱动比起jdbc-odbc桥执行效率大大提高了.
但是,它仍然需要在客户端加载数据库厂商 提供的代码库.这样就不适合基于internet的应用.并且,他的执行效率比起3,4型的jdbc驱动 还是不够高。
Type3:网络协议驱动
这种驱动实际上是根据我们熟悉的三层结构建立的. jdbc先把对数局库的访问请求传递给网 络上的中间件服务器. 中间件服务器再把请求翻译为符合数据库规范的调用,
再把这种调用传给数据库服务器.如果中间件服务器也是用java开发的,那么在在中间层也可以使用1,2型 jdbc驱动程序作为访问数据库的方法.
网络协议驱动--中间件服务器---数据库Server
由于这种驱动是基于server的.所以,它不需要在客户端加载数据库厂商提供的代码库.而且 他在执行效率和可升级性方面是比较好的.因为大部分功能实现都在server端,
所以这种驱动 可以设计的很小,可以非常快速的加载到内存中. 但是,这种驱动在中间件层仍然需要有配置 其它数据库驱动程序,并且由于多了一个中间层传递数据,
它的执行效率还不是最好.
Type4 纯JAVA驱动
这种驱动直接把jdbc调用转换为符合相关数据库系统规范的请求.由于4型驱动写的应用可 以直接和数据库服务器通讯.这种类型的驱动完全由java实现,
因此实现了平台独立性. 本地协议驱动---------数据库Server
由于这种驱动不需要先把jdbc的调用传给odbc或本地数据库接口或者是中间层服务器.所以它的执行效率是非常高的.而且,它根本不需要在客户端或服务器端装载任何的软件
或驱动. 这种驱动程序可以动态的被下载.但是对于不同的数据库需要下载不同的驱动程序.
以上对四种类型的jdbc驱动做了一个说明.那么它们适合那种类型的应用开发呢?
提示:Jdbc-odbc桥由于它的执行效率不高,更适合做为开发应用时的一种过度方案,或着对于初学 者了解jdbc编程也较适用.
对于那些需要大数据量操作的应用程序则应该考虑2,3,4型驱动.在intranet方面的应用可以考虑2型驱动,
但是由于3,4型驱动在执行效率上比2型驱动有着明显的优势,而且目前开发 的趋势是使用纯java.所以3,4型驱动也可以作为考虑对象. 至于基于internet方面的应用就只有考虑3,4型驱动了. 因为3型驱动可以把多种数据库驱动都配置在中间层服务器.所以3型驱动最适合那种需要同时连接多个不同种类的数据库, 并且对并发连接要求高的应用. 4型驱动则适合那些连接单一数据库的工作组应用。
1. ODBC技术
1.1 ODBC介绍
ODBC(Open Database Connectivity,开放数据库互 连)是微软公司开放服务结构(WOSA,Windows Open Services Architecture)中有关数据库的一个组成部分,它建立了一组规范,并提供了一组对数据库访问的标准API(应用程序编程接口)。这些API利用 SQL来完成其大部分任务。ODBC本身也提供了对SQL语言的支持,用户可以直接将SQL语句送给ODBC。
ODBD通过引进ODBC驱动当作应用程序与DBMS的中间翻译层,来实现ODBC接口与DBMS的无关性。实现了ODBC接口的应用程序可以访问任何安装了ODBC驱动的DBMS。
应用程序要访问一个数据库,首先必须用ODBC管理器注册一个数据源,管理器根据数据源提供的数据库位置、数据库类型及ODBC驱动程序等信息,建立起ODBC与具体数据库的联系。这样,只要应用程序将数据源名提供给ODBC,ODBC就能建立起与相应数据库的连接。
在64位系统中打开ODBC管理器的方法为:
(1)查看兼容的32位ODBC驱动:启动 C:/Windows/SysWOW64/odbcad32.exe;
(2)查看64位ODBC驱动,启动C:/WINDOWS/system32/odbcad32.exe 或者【控制面板】-【管理工具】-【数据源(ODBC)】。
1.2 ODBC的由来
早期数据库访问是由本机库来执行的,例如SQL Server的DBLib以及Oracle的OCI(Oracle Call Interface,Oracle调用接口)。这样能保证快速地访问数据库,但是不同的数据库要使用不同的API来访问,导致代码通用性很差。
为了解决这个问题,1992年Microsoft和Sybase、Digital共同制定了ODBC标准接口,以单一的ODBC API来存取各种不同的数据库。随后ODBC便获得了许多数据库厂商和Third-Party的支持而逐渐成为标准的数据存取技术。
ODBC以当时的业界标准规范X/Open Call Level Interface(CLI)和ISO/IEC9075-3Call-LevelInterface(SQL/CLI)为涵盖的范围,因而支持了广阔的数 据库。虽然ODBC在初期的版本中执行效率不佳,而且功能有限,因此也为人们所贬低。但是,随着Microsoft不断地改善ODBC,使ODBC的执行 效率不断增加,ODBC驱动程序的功能也日渐齐全。到目前,ODBC已经是一个稳定并且执行效率良好的数据存取引擎。不过ODBC仅支持关系数据库,以及传统的数据库数据类型,并且只以C/C++语言API(API就是一些C语言的代码,是最底层的程序,在windows中就是一些.dll的文件)形式提供服务,因而无法符合日渐复杂的数据存取应用,也无法让脚本语言使用。因此Microsoft除了ODBC之外,也推出了其他的数据存取技术以满足程序员不同的需要。(注:ODBC是面向过程的语言,由C语言开发出来,不能兼容多种语言,所以开发的难度大,而且只支持有限的数据库公司,对于后来的EXCEL等根本不能支持)。
尽管可以编写直接利用ODBC API的应用程序,但这是相当复杂的。为了避免这种复杂性,微软引入了两个对象模型:DAO(Data Access Object)与RDO(Remote DataObject),可以通过过程性的ODBC API实现面向对象的访问。
2. OLE-DB技术
2.1 OLE DB的由来
随着数据源日益复杂化,现今的应用程序很可能需要从不同的数据源取得数据,加以处理,再把处理过的数据输出到另外一个数据源中。更麻烦的是这些数据 源可能不是传统的关系数据库,而可能是Excel文件,Email,Internet/Intranet上的电子签名信息。Microsoft为了让应用 程序能够以统一的方式存取各种不同的数据源,在1997年提出了Universal Data Access(UDA)架构。UDA以COM技术为核心,协助程序员存取企业中各类不同的数据源。UDA以OLE-DB(属于操作系统层次的软件)作为技术的骨架。OLE-DB定义了统一的COM接口作为存取各类异质数据源的标准,并且封装在一组COM对象之中。藉由OLE-DB,程序员就可以使用一致的方式来存取各种数据。但仍然OLEDB是一个低层次的,利用效率不高。
2.2 OLE DB的介绍
OLE DB(Object Linking and Embedding, Database,即对象连接与嵌入)是微软的战略性的通向不同的数据源的低级应用程序接口。OLE DB不仅包括微软资助的标准数据接口开放数据库连通性(ODBC)的结构化查询语言(SQL)能力,还具有面向其他非SQL数据类型的通路。作为微软的组 件对象模型(COM)的一种设计,OLE DB是一组读写数据的方法(在过去可能被称为渠道)。OLD DB中的对象主要包括数据源对象、阶段对象、命令对象和行组对象。使用OLEDB的应用程序会用到如下的请求序列:初始化OLE连接到数据源à发出命令à 处理结果à释放数据源对象并停止初始化OLE。
OLE DB标准中定义的新概念——OLE DB将传统的数据库系统划分为多个逻辑组件,这些组件之间相对独立又相互通信。这种组件模型中的各个部分被冠以不同的名称,例如数据提供者(Data Provider)是指提供数据存储的软件组件,小到普通的文本文件、大到主机上的复杂数据库,或者电子邮件存储,都是数据提供者的例子。有的文档把这些 软件组件的开发商也称为数据提供者。
我们要开启如Access数据库中的数据,必须用ADO.NET通过OLE DB来开启。ADO.Net 利用OLE DB来取得数据,这是因为OLE DB了解如何和许多种数据源作沟通,所以对OLE DB有相当程度的了解是很重要的。
OLEDB 为一种开放式的标准,并且设计成COM(ComponentObject Model,一种对象的格式。凡是依照COM 的规格所制作出来的组件,皆可以提供功能让其它程序或组件所使用。)组件。OLEDB 最主要是由三个部分组合而成:
(1)Data Providers数据提供者
地位相当于ODBC的驱动程序,负责从数据源中提供数据。凡是透过OLEDB将数据提供出来的,就是数据提供者。例如SQL Server 数据库中的数据表,或是附文件名为mdb 的Access 数据库档案等,都是Data Provider。
(2)Data Consumers数据使用者
凡是使用OLEDB 提供数据的程序或组件,都是OLEDB 的数据使用者。换句话说,凡是使用ADO 的应用程序或网页都是OLE DB 的数据使用者。
(3)Service Components服务组件
数据服务组件可以执行数据提供者以及数据使用者之间数据传递的工作,数据使用者要向数据提供者要求数据时,是透过OLEDB 服务组件的查询处理器执行查询的工作,而查询到的结果则由指针引擎来管理。
2.3 OLE DB和ODBC的区别
由于OLEDB和ODBC标准都是为了提供统一的访问数据接口,所以曾经有人疑惑:OLE DB是不是替代ODBC的新标准?答案是否定的。实际上,ODBC标准的对象是基于SQL的数据源(SQL-Based Data Source),而OLE DB的对象则是范围更为广泛的任何数据存储。从这个意义上说,符合ODBC标准的数据源是符合OLE DB标准的数据存储的子集。
3. ADO技术
3.1 ADO的由来
虽然OLE-DB允许程序员存取各类数据,是一个非常良好的架构,但是由于OLE-DB太底层化,而且在使用上非常复杂,需要程序员拥有高超的技 巧,因此只有少数的程序员才有办法使用OLE-DB。这让OLE-DB无法广为流行。为了解决这个问题,并且让VB和脚本语言也能够藉由OLE-DB存取 各种数据源,Microsoft同样以COM技术封装OLE-DB为ADO对象(这一步是很重要的,实现了多种程序可以互相调,并且可以开发的语言也丰富 了),简化了程序员数据存取的工作。由于 ADO成功地封装了OLE-DB大部分的功能,并且大量简化了数据存取工作,因此 ADO也逐渐被愈来愈多的程序员所接受。
3.2 ADO的介绍
微软公司的ADO(ActiveX Data Objects)是一个用于存取数据源的COM组件。它提供了编程语言和统一数据访问方式OLE DB的一个中间层。允许开发人员编写访问数据的代码而不用关心数据库是如何实现的,而只用关心到数据库的连接。访问数据库的时候,关于SQL的知识不是必要的,但是特定数据库支持的SQL命令仍可以通过ADO中的命令对象来执行。
ADO被设计来继承微软早期的数据访问对象层,包括RDO(Remote Data Objects)和DAO(Data Access Objects)。ADO在1996年冬被发布。
ADO包括了6个类:Connection,Command,Recordset,Errors,Parameters,Fields。
说通俗点OLE DB和ODBC都是最底层的东西,而ADO对象给我们提供了一个“可视化”地和应用层直接交互的组件,我们不用过多的关注OLEDB的内部机制,只需要了 解ADO通过OLE DB创建数据源的几种方法即可,就可以通过ADO轻松地获取数据源。可以说ADO是应用程序和数据底层的一个中间层,ADO对象通过OLE DB间接取得数据库中的数据。OLE DB只是提供了通向各种数据库的一个通用接口,简单的可以用图1来表示:
图1 采用ADO和OLEDB访问数据源
4. ADO.NET技术
ADO和ADO.NET的目的都是为编写数据源访问程序提供支持,但它们是两种完全不同的技术。
ADO使用OLE DB接口并基于微软的COM技术,而ADO.NET基于微软的.NET体系架构,拥有自己的ADO.NET数据库访问接口。众所周知.NET体系不同于 COM体系,ADO.NET接口也就完全不同于ADO和OLE DB接口,这也就是说ADO.NET和ADO是两种数据访问方式。
在开始设计.NET体系架构时,微软就决定重新设计数据访问模型,以便能够完全的基于XML和离线计算模型。两者的区别主要有:
(1)ADO以Recordset存储,而ADO.NET则以DataSet存储。Recordset看起来更像单表,如果让Recordset以多表的方式表示就必须在SQL中进行多表连接。反之,DataSet可以是多个表的集合。
(2)ADO的运作是一种在线方式,这意味着不论是浏览或更新数据都必须是实时的。ADO.NET则使用离线方式,在访问数据的时候ADO.NET会利用XML制作数据的一份副本,ADO.NET的数据库连接也只有在这段时间需要在线。
(3)由于ADO使用COM技术,这就要求所使用的数据类型必须符合COM规范,而ADO.NET基于XML格式,数据类型更为丰富并且不需要再做COM编排导致的数据类型转换,从而提高了整体性能。
图2描绘了ADO.NET体系。图3给出了ADO.NET基于XML进行数据传递的原理图。
图2 ADO.NET架构体系
图3 ADO.NET数据访问原理
5. JDBC技术
5.1 JDBC介绍
JDBC(Java Database Connectivity,Java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。
JDBC与ODBC一样,也是很底层的接口,可以直接调用SQL命令。在它之上可以建立高级接口和工具。高级接口是“用户友好”的接口,它使用的是一种更易理解和更为方便的 API,这种API在幕后被转换为诸如 JDBC 这样的低级接口。
5.2 JDBC与ODBC对比
Microsoft 的 ODBC API 可能是使用最广的、用于访问关系数据库的编程接口。它能在几乎所有平台上连接几乎所有的数据库。为什么 Java 不使用 ODBC?对这个问题的回答是:Java 可以使用 ODBC,但最好是在 JDBC 的帮助下以JDBC-ODBC桥的形式使用,原因是ODBC 不适合直接在 Java 中使用,因为它使用 C 语言接口。从Java 调用本地 C代码在安全性、实现、坚固性和程序的自动移植性方面都有许多缺点。从ODBC C API 到 Java API的字面翻译是不可取的。例如,Java 没有指针,而 ODBC 却对指针用得很广泛(包括很容易出错的指针"void *")。
JDBC与ODBC都是基于X/Open的SQL调用级接口, JDBC的设计在思想上沿袭了ODBC,同时在其主要抽象和SQL CLI实现上也沿袭了ODBC,这使得JDBC容易被接受。JDBC的总体结构类似于ODBC,也有四个组件:应用程序、驱动程序管理器、驱动程序和数据源。
JDBC保持了ODBC的基本特性,也独立于特定数据库。使用相同源代码的应用程序通过动态加载不同的JDBC驱动程序,可以访问不同的DBMS。 连接不同的DBMS时,各个DBMS之间仅通过不同的URL进行标识。JDBC的 DatabaseMetaData接口提供了一系列方法,可以检查DBMS对特定特性的支持,并相应确定有什么特性,从而能对特定数据库的特性予以支持。 与ODBC一样,JDBC也支持在应用程序中同时建立多个数据库连接,采用JDBC可以很容易地用SQL语句同时访问多个异构的数据库,为异构的数据库之 间的互操作奠定基础。
ODBC很难学。它把简单和高级功能混在一起,而且即使对于简单的查询,其选项也极为复杂。相反,JDBC 尽量保证简单功能的简便性,而同时在必要时允许使用高级功能。如果使用ODBC,就必须手动地将ODBC驱动程序管理器和驱动程序安装在每台客户机上。如 果完全用Java编写JDBC驱动程序则JDBC代码在所有Java平台上(从网络计算机到大型机)都可以自动安装、移植并保证安全性。JDBC确保了 “100%纯Java”的解决方案,利用Java的平台无关性, JDBC应用程序可以自然地实现跨平台特性,因而更适合于Internet上异构环境的数据库应用。此外,JDBC驱动程序管理器是内置的,驱动程序本身 也可通过Web浏览器自动下载,无须安装、配置;而ODBC驱动程序管理器和ODBC驱动程序必须在每台客户机上分别安装、配置。
目前,Microsoft又引进了ODBC之外的新API: RDO、ADO和OLE DB。这些设计在许多方面与JDBC是相同的,即它们都是面向对象的数据库接口且基于可在ODBC上实现的类。但在这些接口中,我们未看见有特别的功能使 我们要转而选择它们来替代ODBC,尤其是在ODBC驱动程序已建立起较为完善的市场的情况下。它们最多也就是在ODBC上加了一种装饰而已。
6. ODAC
ODAC全称Oracle数据访问组件(Oracle Data Access Components),是由Oracle官方提供的在.NET环境下进行Oracle数据库编程的一套工具组件。ODAC完全包括了开发所用的组件,例 如ODP.NET、ODT、Oracle Provider for OLE DB等工具,见下图所示:
图4 ODAC组件内容
其中,ODP.NET提供了比ADO.NET更为优化的oracle数据库访问功能。具体见7.1.4;ODT则是Microsoft Visual Studio 2015,Visual Studio 2013, and Visual Studio 2012的oracle数据库开发插件。
ODAC的下载地址为http://www.oracle.com/technetwork/topics/dotnet/utilsoft-086879.html。可以通过Oracle Universal Installer、xcopy、NuGet或者Microsoft Installer进行安装。
7. Oracle数据库访问技术
7.1 在.NET环境下访问Oracle
7.1.1 ODBC方式
首先下载instantclient-basic-win32-11.2.0.1.0.zip和instantclient-odbc- win32-11.2.0.1.0.zip两个文件,将它们解压,放到同一个文件夹下面,运行odbc_install.exe安装。注意,oracle 要与其odbc驱动的位数要匹配,如果不匹配则会报“体系结构不匹配”的错误。
安装完成后,我们可以在【控制面板】-->【管理工具】-->【数据源(ODBC)】-->【系统DSN】中查看系统中已经安装好的ODBC驱动,其中就包含了“Microsoft ODBC Driver for Oracle”。
连接字符串格式:
- Driver={Microsoft ODBC for Oracle}; Server = myServerAddress; Uid = myUsername; Pwd = myPassword;
要求:必须安装oracle 7.3版(或更高)的客户端。
7.1.2 OLEDB方式
打开注册表编辑器,搜索oracle即可以搜索到以下键:
Microsoft OLE DBProvider for Oracle
HKEY_CLASSES_ROOT\CLSID\{e8cc4cbe-fdff-11d0-b865-00a0c9081c1d}\OLEDB Provider
HKEY_CLASSES_ROOT\MSDAORA
所以,只要安装了合适版本的MDAC,那么就可以使用OLEDB来访问ORACLE了。
连接字符串格式:
- Provider=msdaora;Data Source=MyOracleDB;User Id=myUsername;Password=myPassword;
要求:必须安装oracle 8i版(或更高)的客户端。
7.1.3 OracleClient方式
OracleClient(System.Data.OracleClient)是微软针对Oracle开发所研发的ADO.NET Data Provider,从.NET 1.x开始,就已成为.NETFramework类库的一部分,它与微软Visual Studio 的集成性非常好。但是从.NET 4以后的版本中将会移除该类库,不再提供OracleClient的支持。
7.1.4 ODP.NET方式
全称Oracle Data Provider for .net,就是Oracle 为 .NET(ODP.NET) 专门编写了 Oracle Data Provider,一个用于 Microsoft .NET 环境下的 Oracle 数据访问 API 。
要想从 Oracle 所支持的企业应用程序获得预期的响应性能和高级数据库特性,应该选择 Oracle 专用的连接而不是一般的数据库连接。Java 开发人员长期以来一直可以选择使用 Oracle 提供的专用 API 连接到 Oracle 数据库,这些 API 扩展了 JDBC 并为开发人员利用如大型对象 (LOB) 和 Ref Cursor 这样的 Oracle 高级特性提供了一条途径。
2002 年 2 月,Microsoft 推出了 Visual Studio .NET 及其三种语言(C# .NET、Visual Basic .NET 和 C++ .NET)以及底层的 .NET 框架。Microsoft .NET 为建立企业级的桌面、Web 和 client/server 应用程序提供了一个面向对象的开发平台。不幸的是,使用这些 Microsoft 语言和 .NET 框架的开发人员并没有一个现成的、专用于 Oracle 的数据库连接选项。
针对这一问题,Oracle 为 .NET(ODP.NET) 专门编写了 Oracle Data Provider,一个用于 Microsoft .NET 环境下的 Oracle 数据访问 API。在本文中,我们将讨论 ODP.NET 的用法、特性和对性能的改善。我们发现使用 ODP.NET 确实具有一些显著的优势。
如果用ODP.NET来访问ORACLE数据库,需要满足以下条件:
l 操作系统WIN XP 2003;
l .NET FRAMEWORK 1.0以上;
l ORACLE9I以上的客户端。
连接字符串格式:
- Data Source = MyOracleDB; User Id = myUsername; Password = myPassword; Integrated Security = no;
7.2 在JAVA环境下访问Oracle
在Java环境下主要通过JDBC连接Oracle。连接方式主要有两种。
(1)使用JDBC thin连接
thin是for thin client的意思,这种驱动一般用在运行于WEB浏览器中的JAVA程序。它不是通过OCI or Net8,而是通过Javasockets进行通信,是纯java实现的驱动,因此与平台无关,不需要在使用JDBC Thin的客户端机器上安装Oracle客户端软件,只需要下载一个thin驱动的jar包,并且将环境变量中的CLASS_PATH变量中加入thin 驱动的路径就可以了。所以有很好的移植性,通常用在web开发中。
Thin驱动虽然与平台无关,也无需安装Oracle客户端,但是有一个致命的缺陷就是性能一般,达不到如OCI方式的企业级的要求。另外,如果一 个oracle数据库对应一台主机,可以使用thin连接;如果一个oracle数据库对应四五台主机(集群服务器),使用thin时,需要把 tnsnames.ora文件中的相关数据库的整个连接字符串都拷贝下来,如此才能连接上oracle集群数据库。
设置连接字符串是固定的写法,如下所示:
- Class.forName("oracle.jdbc.driver.OracleDriver");
- Connection conn = DriverManager.getConnection ("jdbc:oracle:thin:@10.87.134.107:1521:ora9", "sms", "zzsms");
在上面的连接字符串中,如果不是集群数据库就在@后直接输入数据库IP地址即可;如果是集群数据库,则需要在@后输入tnsnames.ora文件中有关该数据库的所有描述内容(通常是=后边的所有的内容)。
(2)使用JDBC OCI连接
OCI是oracle call interface的缩写,此驱动类似于传统的ODBC驱动。因为它需要Oracle Call Interface and Net8,所以它需要在运行使用此驱动的JAVA程序的机器上安装客户端软件,其实主要是用到oracle客户端里以dll方式提供的oci和服务器配 置。
使用OCI连接数据库是企业级的做法,适应于单个数据库和集群数据库,性能优越,尤其是连接池功能大大提高了应用程序的性能和并发量。唯一的缺点是,若想使用OCI必须要安装Oracle客户端。
安装完Oracle客户端后,里面有个jdbc的文件夹,该文件夹下就包含了OCI驱动和THIN驱动。所以是不需要去网上下载的。这个驱动在 jdbc/lib文件夹下,主要有classes12.jar、nls_charset12.jar等等。其中以12结尾的驱动包适应于jdk1.1以上 的版本。以11结尾的适应于jdk1.1以下的版本。文件名中含有classes的jar包就是驱动程序,文件名中含有nls的jar包是与国际化有关的 类。
找到文件后,就需要把class和nls的jar包的绝对路径加入CLASS_PATH环境变量,否则会报ClassNotFound的异常。
设置环境变量后,就可以直接使用OCI驱动了。不要被“驱动”两个字吓坏了,驱动就是一个可执行文件和一个连接字符串。很简单,无非是连接字符串的问题。标准的连接字符串如下所示:
- Class.forName("oracle.jdbc.driver.OracleDriver");
- Connection con = DriverManager.getConnection("jdbc:oracle:oci:@xxzc","duansiyuan", "oracle_password");
只要这两行,就可以保证连接到数据库,而这个数据库不管是单个数据库还是集群数据库。其中xxzc就是数据库名,duansiyuan就是用户名,oralce_password就是密码。这种方式和C#中的方式比较类似。
需要注意的问题:
1、oracle_home/jdbc文件夹下有大量的样板代码和帮助文档,里面对如何安装和使用jdbc都有详细的说明,请引起高度重视并耐心阅读。里面有很多知识仅通过自己反复的实践是无法获取的。
2、如果想要高性能,请使用OCI连接,如果不想装Oracle客户端,请使用thin连接。
参考资料
[1] ODBC、OLE DB、ADO的区别,http://blog.csdn.net/yinjingjing198808/article/details/7665577
[2] ADO与ADO.NET的区别与介绍,http://www.jb51.net/article/34121.htm
[3] ADO和ADO.NET的区别,http://blog.csdn.net/luckyzhoustar/article/details/24770423
[4] JDBC和ODBC,http://www.tongji.edu.cn/~yangdy/database/paper6.htm
[5] 使用 ODP.NET 访问 Oracle http://www.oracle.com/technetwork/cn/testcontent/o23odp-084525-zhs.html