数据库连接技术整理

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] ADOADO.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


猜你喜欢

转载自blog.csdn.net/wnvalentin/article/details/54947977
今日推荐