数据库访问方式
异构数据库系统混合查询—JDBC/ODBC
异构数据库系统是由多个异构的成员数据库系统组成的数据库系统,异构性体现为各个成员数据库之间在硬件平台、操作系统或数据库管理系统等方面的不同。
Internet上大量信息通过数据库系统可以得到有效的管理。由于历史等原因,Internet上的数据库系统不少是异构的。为了在Internet环境下,基于异种系统平台实现对异构数据库的查询和联合使用,必须提供一个独立于特定的数据库管理系统的统一编程界面。
目前许多数据库系统均支持SQL,对于由SQL数据库组成的异构数据库系统,JDBC和ODBC为访问其异构成员提供了统一的方式,也为各异构成员之间的协作和多个成员之上的操作打下了基础。下文简单介绍了JDBC和ODBC对各个异构的数据库进行统一访问和协作的原理及其应用。
ODBC
ODBC(Open DataBase Connectivity)是微软倡导的、当前被业界广泛接受的、用于数据库访问的应用程序编程接口(API),它以X/Open和 ISO/IEC的调用级接口(CLI)规范为基础,并使用结构化查询语言(SQL)作为其数据库访问语言。 ODBC总体结构有四个组件:
A. 应用程序:执行处理并调用ODBC API函数,以提交 SQL语句并检索结果。
B. 驱动程序管理器(Driver Manager):根据应用程序需要加载/卸载驱动程序,处理ODBC函数调用,或把它们传送到驱动程序。
C. 驱动程序:处理ODBC函数调用,提交SQL请求到一个指定的数据源,并把结果返回到应用程序。如果有必要,驱动程序修
改一应程序请求,以使请求与相关的DBMS支持的语法一致。
D. 数据源:包括用户要访问的数据及其相关的操作系统、DBMS及用于访问DBMS的网络平台。
ODBC驱动程序的使用把应用程序从具体的数据库调用中隔离开来。
驱动程序管理器针对特定数据库的各个驱动程序进行集中管理,并向应用程序提供统一的标准接口,这就为ODBC的开放性奠定了基础。
数据库独立性
ODBC是为最大的互用性而设计的,要求一个应用程序有用相同的源代码(不用重新编译或重新链接)访问不同的数据库管理系统(DBMS)的能力。
ODBC定义了一个标准的调用层接口(CLI)。这包含 X/Open和ISO/IEC的CLI规范中的所有函数,并提供应用程序普遍需要的附加函数。每个支持ODBC的DBMS需要不同的库或驱动程序,驱动程序实现ODBC API中的函数。当需要改变驱动程序时,应用程序不需要重新编译或者重新链接,只是动态加载新的驱动程序,并调用其中的函数即可。如果要同时访问多个DBMS系统,应用程序可加载多个驱动程序。如何支持驱动程序取决于操作系统,例如,在Windows操作系统上,驱动程序是动态链接库(DLL)。使用相同源代码的应用程序访问不同的DBMS,体现了 ODBC的数据库独立性。
对数据库特殊功能的支持
各个DBMS参照的标准、提供的功能不尽相同,应用程序如何以统一的接口使用各个DBMS特有的功能呢?
一方面,ODBC为所有DBMS功能都定义了公共接口。这些DBMS功能比多数DBMS支持的更多,但只要求驱动程序实现这些功能的一个子集。另一方面,ODBC定义了API和SQL语法一致层,它规定驱动程序应支持的基本功能。 ODBC还提供两个函数(SQLGetInfo和SQLGetFunctions)返回关于驱动程序和DBMS能力的一般信息及驱动程序支持的函数列表。因此,应用程序可以检查DBMS支持的特殊功能。
这样,编写应用程序时,就可以检查并自动使用各个驱动程序对应的DBMS所支持的特殊功能。这样做的优点是当增加DBMS支持的功能时,应用程序不需要改变,只需安装更新的驱动程序,应用程序便可以自动发现并使用这些功能。
互操作能力
通过使用多个驱动程序可以同时访问多个DBMS系统。 ODBC提供的Driver Manager实现所有的ODBC函数,多数是传递调用给驱动程序中的ODBC 函数,并静态链接应用程序,或在应用程序运行时加载它。这样,应用程序在Driver Manager 中按名调用驱动ODBC函数,而不是通过每个驱动程序中的指针。当应用程序需要通过特定的驱动程序时,它首先需要一个标识驱动程序的连接句柄。Driver Manager加载驱动程序,并存储每个驱动程序中的函数地址。要使驱动程序调用一个ODBC函数,可在应用程序调用 Driver Manager中的函数,并为驱动程序传送连接句柄,然后Driver Manager使用以前存储的地址来调用函数。
ODBC可以同时连接到多个DBMS,解决了同时访问多个DBMS的问题,提供了异构成员数据库之间互操作的能力。
JDBC
JDBC(Java DataBase Connectivity)是Java与数据库的接口规范,JDBC定义了一个支持标准SQL功能的通用低层的应用程序编程接口(API),它由Java 语言编写的类和接口组成,旨在让各数据库开发商为Java程序员提供标准的数据库API。 JDBC API定义了若干Java中的类,表示数据库连接、SQL指令、结果集、数据库元数据等。它允许Java程序员发送SQL指令并处理结果。通过驱动程序管理器,JDBC API可利用不同的驱动程序连接不同的数据库系统。
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语句同时访问多个异构的数据库,为异构的数据库之间的互操作奠定基础。
但是,JDBC除了具有ODBC的上述特点外,更具有对硬件平台、操作系统异构性的支持。这主要是因为ODBC使用的是C语言,而JDBC使用的是Java语言。Java语言具有与平台无关、移植性强、安全性高、稳定性好、分布式、面向对象等众多优点,而JDBC确保了“100%纯Java”的解决方案,利用Java的平台无关性, JDBC应用程序可以自然地实现跨平台特性,因而更适合于Internet上异构环境的数据库应用。
此外,JDBC驱动程序管理器是内置的,驱动程序本身也可通过Web浏览器自动下载,无须安装、配置;而ODBC驱动程序管理器和ODBC驱动程序必须在每台客户机上分别安装、配置。
JDBC和ODBC在Internet上的应用
JDBC和ODBC由于具有数据库独立性甚至平台无关性,因而对Internet上异构数据库的访问提供了很好的支持。
在Internet上访问数据库通常采用三层模式。以JDBC为例,在三层模式中客户端的Java Applet主要作为用户界面,它不直接与数据库交换信息,而是通过自定义的应用层网络协议与应用服务器交互,应用服务器通过JDBC与数据库服务器交换信息,并实现应用逻辑。DM3的JDBC和ODBC驱动程序支持目前流行的ASP和JSP技术,可以分别借助ODBC和JDBC同时访问Internet上多个异构的数据库。
ASP是面向Web服务器的技术,客户端浏览器不需要任何附加的软件支持。ASP使用VBScript之类的脚本语言,它在HTML代码中嵌入某种程序代码,由HTML代码负责描述信息的显示样式,由嵌入的程序代码来描述处理逻辑。在ASP 下,VBScript代码被ASP引擎在Web服务器端解释执行,执行结果被重新嵌入到HTML代码中,然后一起发送给浏览器。这里,VBScript代码可以通过ODBC访问多个异构的数据库。
JSP是一种基于Java Servlet的Web开发技术,它和ASP 非常相似,但又有区别:在JSP下,嵌入HTML页面的程序代码是Java代码;页面中嵌入的程序代码被编译成Servlet(这种编译操作仅在对JSP页面的第一次请求时发生)并由Java 虚拟机执行。这里Java代码可以通过JDBC访问多个异构的数据库,其平台无关性特别好。当前,Internet上的数据库应用已越来越多,JDBC和ODBC必将在Internet上的异构数据库访问中发挥重要的作用。
微软了的数据访问方式历史演变
ODBC(Open Database Connectivity):
是Microsoft公司开发和定义的一套数据库访问标准,称为开放数据库系统互联。ODBC提供了一种编程接口,可以使用一个ODBC应用程序访问各种数据库管理系统,例如Access、MySQL、DB2、FoxPro、SQL Server和Oracle等,它是第一个使用SQL访问不同关系数据库的数据访问技术。使用ODBC应用程序能够通过单一的命令操纵不同的数据库,而开发人员需要做的仅仅只是针对不同的应用加入相应的ODBC驱动。
DAO(Data Access Objects):
不像ODBC那样是面向C/C++程序员的,它是微软提供给Visual Basic开发人员的一种简单的数据访问方法,但不提供远程访问功能。
RDO(Remote Data Object):
在使用DAO访问不同的关系型数据库的时候,Jet引擎不得不在DAO和ODBC之间进行命令的转化,导致了性能的下降,而RDO(Remote Data Objects)的出现就顺理成章了。
OLE DB(Object Linking and Embedding DataBase):
OLE DB(对象链接和嵌入数据库)随着越来越多的数据以非关系型格式存储,需要一种新的架构来提供这种应用和数据源之间的无缝连接,基于COM(Component Object Model)的OLE DB应运而生了。
ADO(ActiveX Data Object):
基于OLE DB之上的ADO更简单、更高级、更适合Visual Basic程序员,同时消除了OLE DB的多种弊端,取而代之是微软技术发展的趋势。
ADO.NET
是一种基于标准的程序设计模型,可以用来创建分布式应用以实现数据共享。在ADO.NET中,DataSet占据重要地位,它是数据库里部分数据在内存中的拷贝。与ADO中的RecordSet不同,DataSet可以包括任意个数据表,每个数据表都可以用于表示自某个数据库表或视图的数据。DataSet驻留在内存中,且不与原数据库相连,即无需与原数据库保持连接。完成工作的底层技术是XML,它是DataSet所采用的存储和传输格式。在运行期间,组件 (如某个业务逻辑对象或asp.net web表单)之间需要交换DataSet中的数据。数据以XML文件的形式从一个组件传输给另一个组件,由接收组件将文件还原为DataSet形式。DataSet的有关方法与关系数据模型完全一样
因为各个数据源的协议各不相同,我们需要通过正确的协议来访问数据源。有些比较老的数据源用ODBC协议,其后的一些数据源用OleDb协议,现在,仍然还有许多新的数据源在不断出现,ADO.NET提供了访问数据源的公共方法,对于不同的数据源,它采用不同的类库。这些类库称为Data Providers,并且通常是以数据源的类型以及协议来命名的
ADO.NET Data Providers是一组提供访问指定数据源的基本类库。API的开头字符表明了他们支持的协议。
Provider |
API 前缀 |
数据源描述 |
ODBC Data Provider |
Odbc |
提供ODBC接口的数据源。一般是比较老的数据库。 |
OleDb Data Provider |
OleDb |
提供OleDb接口的数据源,比如Access或Excel。 |
Oracle Data Provider |
Oracle |
Oracle数据库 |
SQL Data Provider |
Sql |
Microsoft SQL Server数据库 |
Borland Data Provider |
Bdp |
通用的访问方式能访问许多数据库,比如Interbase、SQL Server、IBM DB2和Oracle。 |
这些数据库连接方式ODBC,DAO,RDO,OLE DB,ADO,ADO.NET都是基于oracle客户端(oracle OCI),中间通过SQL*Net与数据库通信。如果为了追求性能,可以自己开发最适合自己数据库连接方式。
Java程序连接数据库的方式
Java程序连接数据库的方式有三种方式:OCI方式、thin方式和JdbcOdbc桥方式
1. OCI方式
这种实现方法是直接使用数据库厂商提供的用专用的网络协议创建的驱动程序,通过它可以直接将JDBC API调用转换为直接网络调用。这种调用方式一般性能比较好,而且也是实用中最简单的方法。因为它不需要安装其他的库或中间件。几乎所有的数据库厂商都为他们的数据库提供了这种数据库提供了这种JDBC驱动程序,也可以从第三方厂商获得这些驱动程序。
应用程序---JDBC API---驱动程序---数据源
2. Thin方式
thin方式是纯java实现tcp/ip的通讯,而oci方式,客户端通过native java method调用c library访问服务端,而这个c library就是oci(oracle called interface),因此这个oci总是需要随着oracle客户端安装
oracle jdbc oci方式是用java与c两种语言编写的,把jdbc call调用,转换成c调用,通过SQL*Net与数据库通信。而oracle jdbc thin驱动方式全采用java编写,使用jvm统一管理内存,也是通过SQL*Net与数据库通信。
3. JdbcOdbc桥方式(用于windows平台)
JDBC-ODBC桥接器是用JdbcOdbc.Class和一个用于访问ODBC驱动程序的本地库实现的。
由于JDBC在设计上与ODBC很接近。在内部,这个驱动程序把JDBC的方法映射到ODBC调用上,这样,JDBC就可以和任何可用的ODBC驱动程序进行交互了。这种桥接器的优点是,它使JDBC目前有能力访问几乎所有的数据库。通行方式如下所示:
应用程序--->JDBC API--->JDBC-ODBC--->ODBC API--->ODBC层--->数据源
事务控制
无论是java,还是.net都是支持事务控制的,事务是为解决数据安全操作提出的,事务控制实际上就是控制数据的安全访问
事务必须服从ISO/IEC所制定的ACID原则。ACID是原子性(atomicity)、一致性(consistency)、隔离性(isolation)和持久性(durability)的缩写。
原子性:表示事务执行过程中的任何失败都将导致事务所做的任何修改失效。
一致性:表示当事务执行失败时,所有被该事务影响的数据都应该恢复到事务执行前的状态。
隔离性:表示在事务执行过程中对数据的修改,在事务提交之前对其他事务不可见。
持久性:表示已提交的数据在事务执行失败时,数据的状态都应该正确。
Java事务的类型有三种:JDBC事务、JTA(Java Transaction API)事务、容器事务。
.net事务分为本地事务和分布式事务
jdbc/odbc主要优化方式:
1.选择正确的jdbc/odbc驱动程序
2.Connention的优化 使用连接池来管理Connection对象
3.Statement的优化 使用批量更新等
4.Result的优化 正确的从数据库中get数据等
-------end------