简介
DB2 Universal DatabaseTM 通过两个为数据库访问所提供的编程接口(API),JDBC 和 SQLJ,可支持 Java 编程环境。而这些接口的实现就称作 Java 驱动程序。
我们将首先介绍这些驱动程序并且描述 DB2 对它们的支持。然后,我们将考察这些驱动程序可使用的不同形式。这些形式与它们最为匹配的场景紧密相关。Java 程序员也将这些驱动程序的不同形式称为 驱动程序类型。我们还将按照特定于访问主机(Host)数据库的 DB2 Java 驱动程序和类型,为每个可访问性场景提出一些最佳实践。
在结束讨论前,我们将简要地看一看基本的 64 位 DB2 目标数据库实例,并提供一些最佳实践建议和性能提高技巧。
DB2 Java 驱动程序概述
Java 为数据库访问提供了两个主要的 API:JDBC 和 SQLJ。
JDBC
Java 2, Standard Edition(J2SE)规范中将 JDBC
定义为 Java 编程语言的强制性组件。JDBC
是一个与供应商无关的动态 SQL
接口,该接口通过标准化的 Java
方法向应用程序提供数据访问。这些方法和接口被包装成
DB2 JDBC 驱动程序,并且分为了 基于
CLI 的传统驱动程序 和新的 通用
JDBC 驱动程序。
Legacy/CLI
JDBC 驱动程序
Legacy/CLI JDBC 驱动程序在文件 db2java.zip
中提供。其实现包名称为
com.ibm.db2.jdbc.app.DB2Driver 或
COM.ibm.db2.jdbc.net.DB2Driver。该驱动程序目前已被用于进行
J2EE 认证。其别名“app 驱动程序”(Type 2)源自于一种观念及其包名称,这种观念就是:该驱动程序将通过远程数据库的本地
DB2 UDB 客户机执行本地连接。而 Type 3
驱动程序又被称作网络驱动程序。
通用的
JDBC 驱动程序
通用的 JDBC 驱动程序在文件 db2jcc.jar 中提供(Type
2
的实现则需要一个本机库)。其实现包名称为
com.ibm.db2.jcc.DB2Driver。该驱动程序是 DB2 UDB for
Linux,UNIX and Windows V8.1 中的新功能。
在最初的实现(V8.1)中,该驱动程序用于使用 Type 4 驱动程序体系结构与 DB2 服务器进行直接的 Java 连接。在 DB2 V8.1.2 中,您可以在 Type 2 体系结构中使用该驱动程序。在 Type 2 体系结构中使用此驱动程序的一个主要原因是为了本地应用程序性能和分布式事务支持。通用 JDBC Type 2 驱动程序分别使用 com.ibm.db2.jcc.DB2XADataSource 和 com.ibm.db2.jcc.DB2ConnectionPoolDataSource 来支持分布式事务和连接池。
SQLJ
SQLJ 是一个用于从 Java
应用程序进行数据访问的标准开发模型。SQLJ
API 是在 SQL 1999 规范中定义的。SQLJ
提供了独特的使用静态 SQL
语句进行开发以及在 DB2
包级别控制访问的能力。新的通用 JDBC
驱动程序在一个实现中同时为 JDBC 和 SQLJ API
提供了支持。JDBC 和 SQLJ
可以在同一个应用程序中互操作。
图 1 展示了一些从 Java 编程的角度通过这两个驱动程序来访问 DB2 数据的可能方法。
打包信息
DB2 UDB 应用程序开发客户机包含用以连接到
UNIX、Linux、Windows、z/OS 或 OS/400 上的 DB2 UDB
数据库的驱动程序代码。如果您打算访问 DB2
UDB for z/OS 或 DB2 UDB for OS/400,就请在您的开发环境中使用
DB2 Connect 产品。DB2 UDB Application Development client
包含开发 C、COBOL 和 Java
应用程序所需的所有驱动程序。如果您打算开发一个多层应用程序,而该应用程序使用诸如
WebSphere Application Server 的 J2EE
应用程序服务器,那么每个应用程序服务器都将需要
DB2 UDB Runtime Client 或 DB2 UDB Application Development
Client。
DB2 Connect
DB2 Connect
使用户可直接将主机数据用于个人计算机和基于
LAN 的工作站。除了可连接 z/OS 和 iSeries DB2
数据库,DB2 Connect
还提供了各种其他的中间层功能,例如:
- 连接池
- 应用程序、协同代理以及到 DB2 的连接之间 1-1-1 的关系。
- 连接属性和断开连接时返回给池的相应的主机连接。
- 连接集中器(事务池):
- 应用程序与到 DB2 的连接之间 N-1 的关系。
- 连接代理和提交/回滚时返回给池的相应的主机连接。
- 事务一旦完成,连接就可以用于另一应用程序。
- 许多不同的应用程序都可以重用同一 DB2 线程(DBAT)。
关于这些驱动程序和可访问性的更多详细信息,请参阅本文的有关内容。
典型的主机可访问性场景
Type 1
驱动程序
JDBC Type 1 驱动程序是基于 JDBC-ODBC
桥的。因此,可以将 ODBC 驱动程序与该 JDBC
驱动程序结合使用。IBM 未提供 Type 1
驱动程序,而它也并非推荐环境。
Type 2
驱动程序
JDBC Type 2 驱动程序依靠特定于 OS
的库(共享库)与 RDBMS
进行通信。应用程序加载 JDBC
驱动程序之后,该驱动程序用共享库与 DB2
服务器进行通信。传统的驱动程序和通用驱动程序都提供
Type 2 实现。传统的驱动程序实现可在 DB2 v8.1
中获得,而通用驱动程序实现在 DB2 v8.1.2
以及更高的版本中提供。
可用性
该场景最适合于其中应用程序服务器可获得
DB2 Connect
网关的应用程序。如果在本地可获得网关,那么使用该场景就会有性能优势,因为加载本机
DB2
库时只存在极小的开销和网络延迟。然而,并非使
DB2 Connect
位于应用程序服务器本地就影响可用性,因为如果节点失败,那么这两层都存在系统运行中断的内在危险。
应用程序端的设置:
JDBC 驱动程序类路径:
通用驱动程序:
- $DB2_Instance_Path/sqllib/java/db2jcc.jar
- $DB2_Instance_Path/sqllib/java/cisuz_licence.jar (as applicable)
Legacy/CLI 驱动程序:
- $DB2_Instance_Path/sqllib/java/db2java.zip
数据源 DB URL:
- jdbc:db2:db_alias
- 示例:jdbc:db2:t2db
数据源实现:
- 通用驱动程序:COM.ibm.db2.jcc
- Legacy/CLI 驱动程序:COM.ibm.db2.jdbc.app
DB2
Connect 设置:
DB2 Connect 的设置通过 DB2 catalog 命令建立。
- db2 catalog tcpip node node_alias remote host_name
server portnumber
示例:db2 catalog tcpip node t2node remote hostmachine server 447 - db2 catalog dcs db dcs_alias as host_subsystem
示例:db2 catalog dcs db t2dcs as hostdcs - db2 catalog db dcs_alias as db_alias at
node node_alias authentication dcs
示例:db2 catalog db t2dcs as t2db at node t2node authentication dcs
应修改主机、服务器(通常为 447)、dcs 数据库等以符合您的设置。
注意:在继续下去之前应先配置用于 TCP/IP 协议的设置。下列命令将确认 TCP/IP 设置:
- db2set db2comm=tcpip
- db2 update dbm cfg using svcename portnumber
图 2 用图形详述了该场景。这些应用程序在本地调用 DB2 库,并且由 DB2 catalog 提供对主机数据库的访问。
带有 XA
支持的 Type 2 驱动程序
带有 XA(扩展体系结构)的 JDBC Type 2
驱动程序支持遵循 Java Transaction API(JTA),它充当了事务管理器与分布式事务系统中所涉及的各部分(资源管理器、应用程序服务器以及事务应用程序)之间的标准接口。传统的驱动程序和通用驱动程序都具有
Type 2 实现,该实现支持 JTA 并且只在 DB2 v8.1.2
中可用。
可用性
该场景最适合于包含涉及多个目标数据库的两阶段提交的事务,以及其中应用程序服务器可获得
DB2 Connect
网关的的应用程序。该场景中包含一些特定的细节,用以设置事务管理器来启用
XA 支持。
应用程序端的设置:
JDBC 驱动程序类路径:
- 与 JDBC Type 2 驱动程序的设置相同
DB2
Connect 设置:
JDBC 驱动程序类路径:
- 与 JDBC Type 2 驱动程序的设置相同。
除了这些配置设置,涉及主机和 iSeries 数据库服务器的许多多地点更新场景还需要配置 Sync Point Manager(SPM)组件。在创建 DB2 实例时,会用默认设置自动地配置 DB2 SPM。DB2 Connect SPM 组件充当了 XA 协议(用于应用程序和 DB2 Connect 服务器之间)和本机 DRDA 两阶段提交协议(用于 DB2 Connect 服务器和 DB2 z/OS 之间)之间的转换程序。SPM 会维护它自己的事务日志,而在进行不同的 XA 事务管理器活动(通常是指再同步)时,就会用到这些日志。从 XA 事务管理器的角度来看,DB2 Connect SPM 充当了 DB2 z/OS 的代理。
另外,还应该考虑 DB2 Connect
事务处理监控程序名(tp_mon_name)的配置参数。tp_mon_name
数据库管理器配置参数将识别正使用的 TP
监控程序产品名(例如 CICS 或 ENCINA)。以下是设置这些参数所需要的命令:
- db2 update dbm cfg using spm_name spm_name
- db2 update dbm cfg using tp_mon_name tp mon
关于这些参数的更多细节,请查阅 DB2 Connect Guide。
图 3. 使用带有 XA 支持的
Type 2 驱动程序的应用程序
Type 3
驱动程序
JDBC Type 3 驱动程序是一种纯 Java
实现,它必须与 DB2 JDBC Applet
服务器通信才能访问 DB2 数据。JDBC Type 3
驱动程序通常被称作“网络驱动程序”,它是根据其包名
COM.ibm.db2.jdbc.net 命名的。DB2 Version 8.1
支持网络驱动程序,所以您可以将其用于 JDBC
应用程序。
可用性
Type 3 驱动程序用以支持 Java applets 来访问 DB2
数据源。目前,WebSphere Application Server
以及其他 J2EE 服务器都不支持 DB2 Type 3
驱动程序,因为该驱动程序不支持分布式事务(JTA)。将来的版本也不会对
Type 3 驱动程序进行增强。
我们鼓励使用通用 JDBC Type 4 驱动程序来替代传统的/CLI Type 3 驱动程序。从 DB2 v8.1 开始,传统的 Type 3 驱动程序已经不再推荐使用。
DB2
设置:
Type 3 驱动程序要求 db2java.zip
驱动程序总是处于与 DB2 Applet
服务器相同的维护级别。如果驱动程序在
applet
内使用,这就不是一个问题,因为浏览器会在应用程序执行期间下载相应的
db2java.zip 文件。许多客户使用 Type 3
驱动程序而非 Type 2 驱动程序,以避免必需的
DB2 客户机安装和必需的 DB2 CATALOG DATABASE
命令,后者用于创建使用传统的/CLI
驱动程序进行 Type 2
连接所必需的数据库目录信息。
Type 4
驱动程序
Type 4 驱动程序是仅用于 Java 的 JDBC
驱动程序,它直接连接到数据库服务器。DB2
UDB for Linux、 UNIX 和 Windows v8.1 引入了称为 通用
JDBC 驱动程序 的 Type 4 驱动程序。
可用性
DB2 Type 4
驱动程序通过分布式关系数据库体系结构(Distributed
Relational Database Architecture,DRDA)提供全 Java
远程连通性。这对于任何现在使用 Type 3
驱动程序的应用程序都是一条自然的迁移路径。
应用程序端的设置:
JDBC 驱动程序类路径:
- $DB2_Instance_Path/sqllib/java/db2jcc.jar
- $DB2_Instance_Path/sqllib/java/db2jcc_license_cisuz.jar (as applicable)
请注意,通用 Type 2 和通用 Type 4 驱动程序具有相同的实现类名称。有两种方法可以区别 DB2 在内部将实例化哪个驱动程序:
- 使用连接特性 (driverType) 来确定连接是否使用共享库(Type 2),或者驱动程序是否会启动来自 Java 应用程序的直接连接(Type 4)。
- 使用不同的连接 URL 模式来指示您需要
Type 2 和 Type 4 行为中的哪一种。
Type 4 URL 模式的示例:字符串 jdbc:db2://server1:447/sample 要求 JDBC 驱动程序将 Java 应用程序直接连接到 DB2 服务器(server1)上名为 sample 的数据库,该数据库位于配置在 DB2 服务器(主机名为 server1)上的 DB2 实例中,而 DB2 服务器则在端口 447 上进行侦听。
以下是 Type 2 URL 模式的示例:字符串 jdbc:db2:sample。有关 DB2 服务器 (server1)和端口 (447)的信息可以在 DB2 客户机编目目录中找到。
数据源 DB URL:
- jdbc:db2://serverName:portNumber/t4db
图 4 说明了 DB2 Type 4 驱动程序的用法。
请注意:可以使用 DB2 Connect 网关来提供稳定的中间层,以及在体系结构中利用连接池和故障转移(failover)等功能,并且仍然使用 DB2 Type 4 驱动程序。您必须在 DB2 Connect 网关上编目主机(Host)数据库。图 5 说明了该设置。
图 5. 使用带有 DB2 Connect 的
Type 4 驱动程序的应用程序
带有 XA
支持的 Type 4 驱动程序
目前,DB2 通用驱动程序不支持 XA。但下一版本中已计划提供该支持。
64
位目标实例
DB2 支持 64 位实例,64 位实例提供了比 32
位实例更好的各种性能。那些需要进行大量 IO
的应用程序可从 64 位实例中获得好处,因为64
位体系结构的操作系统上可获得更大的地址空间,从而获得更大的缓冲池等等。
可用性
32 位应用程序(如 WebSphere Application Server)可链接
64 位的 DB2 本机库。当您试图将 32
位的对象链接到 64 DB2
应用程序库时,将会返回一条操作系统的连接程序出错消息。其解决的办法是使用带有
32 位应用程序(比如 WebSphere Application Server、WebSphere
MQuse 等等)的 32 位 DB2 客户机来访问 64 位 DB2
实例上的数据。
如果两个实例在同一机器上,那么与仅使用一个实例相比就会存在一点点性能开销,因为这样会增加 TCP/IP 延迟。但是,如果您正访问的实例位于远程机器上,则不存在额外的性能损失,而且您也可以使用所有的 64 位功能。
DB2
设置:
假设 DB2INST1 是主机 DB2HOST1 上的一个 32
位客户机实例,DB2INST2 是主机 DB2HOST2
上包含了名为 TESTDB 的数据库的一个 64
位实例,并将该实例的 TCP/IP
侦听器端口定义为 50000。
(请注意,这两个实例也可以位于同一主机上)。
对于该场景,其设置如下:
对于 DB2 通用 Type 2 和传统的 Type 2 驱动程序:
从 DB2INST1 发出下列命令:
- db2 catalog tcpip node DB2HOST2 remote DB2HOST2 server 50000
- db2 catalog db TESTDB as TESTDB at node DB2HOST2
现在,使用如下的数据库连接 URL:
- jdbc:db2:TESTDB
对于 DB2 通用 Type 4 驱动程序:
不需要编目远程数据库。
可以使用如下数据库 URL:
- jdbc:db2://DB2HOST2:50000/TESTDB
WebSphere 设置:
WebSphere 中的数据源应该也应通过上述方法来配置。此外,您还需要通过 DB2 驱动文件的位置和由 32 位实例 所提供的其他必要文件来配置 WebSphere JDBC 驱动程序的类路径设置。
示例:$DB2INST1/sqllib/java/db2jcc.jar - 添加到 JDBC 驱动程序类路径中。
附录
OS/390
上 DB2 的绑定包:
对于 OS/390 DB2 v6 和 v7:
请确保应用了 PTF PQ72453 和 PQ62695。
此外,请与 DBA 确认是否已经运行了 DB2
通用驱动程序绑定者(binder)实用程序。
绑定者实用程序的有关细节:
在 UDB for Unix and Windows 版本 8 上,要预先安装
JDBC/CLI 预备包。在 UDB for OS/390 版本 6 和 7
上,则必须用所提供的绑定者实用程序手工将这些包绑定到服务器。绑定者实用程序用于将标准的
IBM JDBC 包添加到目标数据库的 URL
中。会将最新版本的 IBM JDBC
包集绑定到服务器。从命令行用 java
com.ibm.db2.jcc.DB2Binder
加上下面所描述的参数来调用绑定者实用程序。
java com.ibm.db2.jcc.DB2Binder -url jdbc:db2://server_name:port_number/database_name
-user username -password password
-user
用户必须具有绑定权限。要将对 JDBC
包的访问授权给 PUBLIC。
-size
绑定到每个 DB2 隔离(isolation)和保持能力(holdability)的内部
JDBC 包的数目。其默认值为 3。由于有 4 种 DB2
事务隔离和 2
种游标保持能力,所以将绑定该选项所指定数目的
4x2=8
倍个动态包。此外,总是要为内部使用而绑定一个静态包。
-collection
用于该 JDBC 包的集合 ID,默认为 NULLID。所提供的集合名将被绑定者实用程序转换为大写体。可由
DBA 用以创建 JDBC
包集的多个实例。该选项与连接/数据源属性
jdbcCollection 一同使用。
-tracelevel
用于打开或关闭跟踪以及指定跟踪粒度。跟踪级别选项由通用驱动程序
traceLevel
数据源属性指定。关于完整描述,请参阅
DB2BaseDataSource.traceLevel
的文档。对于完全跟踪,要使用 TRACE_ALL。并非所有的
JDBC 跟踪级别选项对于 DB2Binder 都有意义。
-action
指明是添加包还是替换包。默认情况为“add”。add
-
指示仅当它还未存在时,才可以创建一个新包。replace
- 指示可创建一个新包来替换任何现有的包。
注意:目前 IBM JDBC
包集只有一个版本。因此,目前的语法不允许添加或删除指定版本的
JDBC 包集。
注意:如果最新版本的 JDBC
包集已绑定到服务器,那么就要忽略该操作,而且绑定请求将被下列
DB2 目标服务器拒绝:DB2 for OS/390 v6 和 v7、DB2
for Unix/Windows v8。如果最新的 JDBC
包集已绑定到服务器,那么绑定请求将被
Unix/Windows UDB v7
服务器接受,但是预先存在的同一版本的 JDBC
包集将被替换掉。