选择合适的JDBC驱动程序

类别:Java 点击:0 评论:0 推荐:
如果你不了解JDBC驱动程序各个特性指标的具体含义,或者不了解到底哪些特性才值得重视,要从大量的驱动程序中选择最合适的一个并不容易。本文将助你一臂之力。

概述

说到数据库驱动程序,可以借用喜剧演员Rodney Dangerfield的一句话:“勿以等闲视之”。许多开发者认为驱动程序只是一些功能确定且无足轻重的工具,但事实上,驱动程序往往不是数据转换器或数据管道那么简单,它们的有些特性极其重要,既影响着应用的性能,也影响着应用的功能发挥。

Java开发者常常需要访问包括关系数据库在内的各种各样的数据源,JDBC驱动程序利用JDBC标准建立起了Java程序和数据源之间的桥梁。在JDBC出现之前,Java开发者为了构造带有数据库事务的应用,不得不沉陷于各种复杂的SQL语句。为了解决这个问题,Sun和它的合作者开发出了简化Java应用访问各种数据资源的JDBC API。

一进入JDBC驱动程序的世界,你很快会有一种眼花缭乱的感觉:可供选择的驱动程序实在太多了!虽然拥有选择的权利是一件好事,但是,举例来说,Sun网站上列出了160多个JDBC驱动程序,却没有详细说明究竟哪一个驱动程序更好,好在哪里?虽然根据说明,每一个驱动程序都支持某些重要的功能集,但还有一个问题有待回答:在一个具体的环境中,这些不同驱动程序支持的功能集到底有什么意义?这就是本文要讨论的问题。

我们来回顾一些JDBC标准和驱动程序的基础知识。首先,JDBC提供了完成下列基本任务的方法:

● 以URL或注册到JNDI名称服务的DataSource对象为基础,创建和管理数据源连接。因此,客户端不必进行复杂的配置。

● 构造SQL命令,向数据源发送SQL命令。

● 提取和处理返回给Java应用或Applet的结果集。

JDBC把Java数据库调用转换成访问表格式数据源的SQL语句。这些数据源既包括企业级的SQL数据库系统,例如Oracle、SQL Server、IBM UDB、Informix、Sybase等等,也有电子表格和扁平文件的数据源,如CSV、TSV和大型机数据文件。有了JDBC,我们就可以用单一的命令更新多个字段、在单个事务中处理多个数据源(表)。这意味着:

● 可以通过批量处理优化数据访问性能。

● JDBC提供了访问不同数据库产品的公共框架,不管这些数据库系统本身是否具有互操作能力。

● 为数据源提供了一个抽象层,当数据源类型发生变化时,修改数据源定义变得更加简单。

如果客户程序要调用的软件或中间层服务器要调用的中间件不属于开发者控制范围,JDBC提供了通过Internet访问数据源的能力。JDBC充分发挥了Java可移植、自包含的特性,避免了仅仅由于平台、环境的不同而为同一个应用提供多个版本的必要。

JDBC规范以及驱动程序分类



现在我们来看看JDBC规范。JDBC规范历史上经历了几次重大的版本更新:

● JDBC 1.0:提供基本的功能,强调易用性。

● JDBC 2.0:提供更多高级功能以及服务器端的处理能力。

● JDBC 3.0:完善了API,优化性能。改进了连接池、语句缓冲机制,提供了向Sun连接器体系的迁移途径。

一些在JDBC 2.0规范中可选的功能,例如分布式事务,在JDBC 3.0规范中是必需的。同时,JDBC 3.0还定义了一些新的特性,例如在缓冲池中缓冲经过预处理的命令等。

最初的Java语言规范并没有规定Java程序如何访问数据库。但不久之后,Sun和它的合作者就开始填补这个空白。早期的Java数据访问策略依赖于建立通向ODBC(ODBC是Microsoft发起的数据源访问标准)的桥梁,结果就是JDBC-ODBC桥接驱动程序。今天,JDBC驱动程序总共有四种类型:

第一类:JDBC-ODBC桥,再加上ODBC驱动程序。

第二类:本机API,部分是Java的驱动程序。

第三类:面向数据库中间件的纯Java驱动程序。

第四类:直接面向数据库的纯Java驱动程序。

第三、四两类都是纯Java的驱动程序,因此,对于Java开发者来说,它们在性能、可移植性、功能等方面都有优势。

第一类

第一类JDBC驱动程序是JDBC-ODBC桥再加上一个ODBC驱动程序。Sun建议第一类驱动程序只用于原型开发,而不要用于正式的运行环境。桥接驱动程序由Sun提供,它的目标是支持传统的数据库系统。Sun为该软件提供关键问题的补丁,但不为该软件的最终用户提供支持。一般地,桥接驱动程序用于已经在ODBC技术上投资的情形,例如已经投资了Windows应用服务器。

尽管Sun提供了JDBC-ODBC桥接驱动程序,但由于ODBC会在客户端装载二进制代码和数据库客户端代码,这种技术不适用于高事务性的环境。另外,第一类JDBC驱动程序不支持完整的Java命令集,而是局限于ODBC驱动程序的功能。

第二类

第二类JDBC驱动程序是本机API的部分Java代码的驱动程序,用于把JDBC调用转换成主流数据库API的本机调用。这类驱动程序也存在与第一类驱动程序一样的性能问题,即客户端载入二进制代码的问题,而且它们被绑定了特定的平台。

第二类驱动程序要求编写面向特定平台的代码,这对于任何Java开发者来说恐怕都不属于真正乐意做的事情。主流的数据库厂商,例如Oracle和IBM,都为它们的企业数据库平台提供了第二类驱动程序,使用这些驱动程序的开发者必须及时跟进不同数据库厂商针对不同操作系统发行的各个驱动程序版本。

另外,由于第二类驱动程序没有使用纯Java的API,把Java应用连接到数据源时,往往必须执行一些额外的配置工作。很多时候,第二类驱动程序不能在体系结构上与大型主机的数据源兼容;即使做到了兼容,效果也是差强人意。

由于诸如此类的原因,大多数Java数据库开发者选择第三类驱动程序,或者选择更灵活的第四类纯Java新式驱动程序。



 

图一:第1、2两类驱动程序的体系比较



第三类

第三类JDBC驱动程序是面向数据库中间件的纯Java驱动程序,JDBC调用被转换成一种中间件厂商的协议,中间件再把这些调用转换到数据库API。第三类JDBC驱动程序的优点是它以服务器为基础,也就是不再需要客户端的本机代码,这使第三类驱动程序要比第一、二两类快。另外,开发者还可以利用单一的驱动程序连接到多种数据库。

第四类

第四类JDBC驱动程序是直接面向数据库的纯Java驱动程序,即所谓的“瘦”(thin)驱动程序,它把JDBC调用转换成某种直接可被DBMS使用的网络协议,这样,客户机和应用服务器可以直接调用DBMS服务器。对于第四类驱动程序,不同DBMS的驱动程序不同。因此,在一个异构计算环境中,驱动程序的数量可能会比较多。但是,由于第四类驱动程序具有较高的性能,能够直接访问DBMS,所以这一问题就不那么突出了。



 

图二:第3、4两类驱动程序的体系比较



 

选择JDBC驱动程序



Sun在http://industry.java.sun.com/products/jdbc/drivers维护着一个JDBC驱动程序的清单,如图三所示。这个页面提供了一个驱动程序选择工具,能够根据指定的特征显示出符合要求的驱动程序,允许指定的特征包括驱动程序类型、支持的JDBC版本、支持的数据库等等。今天(2002年09月),这个页面收集的驱动程序已经达到165个!

许多人用这个选择工具来确定自己要用的驱动程序。所以,有必要详细介绍一下这个选择工具:

● JDBC API Version:选择JDBC版本,可从1.x、2.x或3.x中任选一种。

● Certified for J2EE:J2EE认证,可选择J2EE 1.3或J2EE 1.2(其中之一或全部)。

● Driver Type:驱动程序类型,1、2、3或4,任意一种或全部。

● Supported DBMS:支持的DBMS,有83个选项,大部分是各厂商的数据库产品,但也有一部分是产业标准,例如JDBC、LDAP、ODBC、OLE DB Provider、Text(TSV)、SQL/DS,以及XML。可选择一个或多个。

● Required Features:必需的特性,包括DataSource、连接池(Conn. Pooling)、分布式事务(Dist. Trans.)、记录集(RowSets),可任选一个或者多个。

● Returns per page:每页返回的结果数量。



 

图三:Sun的JDBC驱动程序选择工具



下面我们来看看各个选项分别有哪些意义。

JDBC API

JDBC API的重要性在于,它决定了Java开发者可用的功能。早期的Java应用可能无法使用JDBC 3.0提供的许多高级特性,但这些特性对于高事务性、分布式的应用来说必不可少。使用最新版本的JDBC API,开发者才能使用各种新的DBMS和操作系统安全扩展,以及诸如连接池、语句缓冲池、RowSets对象等最新的性能优化机制。

J2EE认证

记住,JDBC只是一个规范,而不是一个软件的标准实现。各个厂商可以根据需要实现自己的JDBC驱动程序。有一些驱动程序完全遵从J2EE规范,还有许多驱动程序不遵从J2EE规范。JDBC驱动程序的J2EE认证(即获取Certified for J2EE logo)由Sun的CTS(Certification Test Suite)确定,如果要判断一种驱动程序是否比另一种优秀,它可以作为判断驱动程序质量的标准之一。一般我们可以认为,通过这种认证的厂商对产品质量比较关注,在http://java.sun.com/products/jdbc/industry.html可以找到一个拥有相关产品且认可(Endorse)JDBC标准的厂商清单。

必需的特性

图三Required Features部分提供了几个JDBC驱动程序的特性选项,这些特性在JDBC 2.0规范中开始引入,但在JDBC 3.0中是必需的。

DataSource是一个由JDBC驱动程序管理的包含数据库连接信息的对象。DataSource与JNDI服务协作,数据库连接的实例化和管理工作都独立于使用它的应用之外。与连接有关的信息,例如路径和端口号,可以在DataSource对象的属性中方便地修改,无需改动使用该数据源的应用代码。当前,Sun收集的总共165个驱动程序中有62个支持该特性。

JDBC支持连接池。所谓连接池,就是让一些数据库连接对象在缓冲池中保持打开状态,使得任何请求使用数据库连接的应用都能够立即获得数据库连接,不再需要昂贵的网络开销联系数据库服务器取得连接,连接池会从本地缓冲池中取得空闲的连接赋予发出请求的Java应用。当应用终止数据库连接,数据库连接实际上并未被拆除,而是返回给连接池缓冲区供其他应用重用,从而有效地提升数据库访问性能。

在数据库事务中,建立连接是资源开销最大的操作。当一个应用试图建立数据库连接时,需要多次网络交互过程才能完成(例如,对于Oracle数据库连接,这个数字是9)。然而,一旦成功建立了连接,把这个连接保留下来再在以后的操作中重用,开销就要小得多。数据库连接池特性大大提高了改进数据传输性能和可伸缩性的潜力,对于应用服务器来说尤其如此。Sun收集的JDBC驱动程序中有62个支持连接池。

在分布式系统中,应用常常需要用多个事务提取数据,且数据往往来自多个数据源。要求有独立的事务协调系统进行协调的事务称为分布式事务。对于Java数据库开发者来说,除了JDBC驱动程序的性能指标之外,分布式事务支持也许是最重要的特性了。

分布式事务要求有额外的资源提供可靠的支持,这主要是由于从不同数据源提取数据的延迟不同,同时也由于存在着互操作的问题。例如,要区分一个失败的事务和一个响应缓慢的事务并不容易,这就要求DTS中的资源管理器以适当的方式注册并协调ROLLBACK或COMMIT操作,同时应当尽量地减少编程工作量。

一般地,分布式事务利用事务管理器(Transaction Manager)进行不同资源管理器的协调工作。有了DTP(Distributed Transaction Processing)体系中的事务管理器提供应用与资源的仲裁,就有可能为应用提供跨越多个数据资源的ACID事务。

在需要多个步骤才能得出所需结果的场合,需要有一种软件模块,通常是事务管理器,协调各个处理过程,例如iPlanet Trustbase Transaction Manager就是这样一个产品。当前Sun收集的JDBC驱动程序中有45个支持此特性。

RowSets(记录集)对象是查询的结果集,包含从表格式数据源获取的记录。RowSets拥有类似于JavaBean的属性和事件提醒机制,同时它本身也是一个JavaBean组件,可以在开发环境中用编程的方式创建和使用。RowSets有连接的(Connected)和非连接的(Disconnected,或称之为离线式的)两种类型。非连接的记录集在提取数据时需要连接到数据源,但处于非连接状态时就不再需要JDBC驱动程序。这种记录集体积小,常用来把数据发送给瘦客户端。非连接的记录集保存在内存中,同时保存的还有其原数据(Metadata)和连接以及执行指令。与此相对,连接的记录集在被使用时总是保持一个打开的连接。当前Sun收集的驱动程序共有31个支持记录集特性,这个数字相对较小,也许是由于该特性不是经常要用到。

必须指出的是,Sun的JDBC网站把“支持”RowSets定义成JDBC驱动程序本身正式打包和带有RowSets,所以,这个网站上列出的一些驱动程序可能没有支持RowSets的标记,但它们实际上却支持多种RowSets。

JDBC 3.0规范定义了prepared statement pooling(把已准备好的SQL语句放入缓冲池),当前未被Sun加入到图三的JDBC驱动程序搜索工具,但可以确信它不久就会被作为一个可搜索的特性加入。从本质上看,语句缓冲是把已经优化且已经运行过的SQL语句保存到缓冲池,一旦需要再次执行,可以不必再进行优化之类的预处理过程。SQL语句池能够显著地提升性能,对于任何JDBC驱动程序来说,它都是一个值得关注的亮点。

对于需要多次执行的SQL语句,缓冲已准备好的语句特别有用。举例来说,如果一个查询的功能是提取特定产品类别的当前库存值,每天都要频繁地运行多次,那么它就可以从语句缓冲获益。再次执行已缓冲的SQL语句时,只需向查询传入参数;所有的预处理步骤,例如语法检查、目标合法性检查、优化访问路径、优化执行计划等,都已经缓冲在内存中。

对于开发者来说,语句缓冲池还有一个特别的优点,即它无需开发者编写任何代码(就如连接池一样)。只要你采用了带有语句池机制的驱动程序,你就得到了语句缓冲带来的性能优势。

只要JDBC驱动程序支持,语句池和连接池可以在一个应用中同时起作用。当程序用到来自连接池的连接,所有以前曾经运行过SQL语句的连接会拥有已经定义好的语句池。因此,即使应用第一次利用某个连接准备执行SQL语句,也可能不需要SQL语句执行前的准备过程。

结束语



JDBC驱动程序会对应用的表现产生许多重大的影响。对于系统的整体性能来说,JDBC驱动程序的特性实际上是一个关键性因素。不仅在企业级数据库应用中是这样,对于要访问分布式数据资源的应用,这个问题就更加突出。

从长远的眼光来看,当你选择驱动程序时,请把JDBC 3.0定义的特性,包括DataSource对象、连接池、分布式事务支持、RowSets、语句缓冲池等,作为选择标准之一。只要有可能,就要选择那些直接操作数据库API的驱动程序,而不要选择那些经过一层转换后才与数据库API交互的驱动程序,因为前者往往具有较好的性能表现。

如果性能和对Java标准的遵从性都是必不可少的考虑因素,驱动程序非三、四两类莫属。找出那些支持最新版本规范、提供最丰富功能的JDBC驱动程序,绝对是一件值得做的事情。另外还有一个需要考虑的因素是,个别JDBC驱动程序提供了一些通常不会随着DBMS本机驱动程序提供的附加工具,这些工具可能会对你的开发工作产生重要影响。

本文地址:http://com.8s8s.com/it/it16144.htm