如果你不了解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规范中开始