48
56 DBX () {
57
58 Connection db2con = null;
59 Connection ifxcon = null;
60 DB2XADataSource db2ds = null;
61 IfxXADataSource ifxds = null;
62 Xid db2xid = null;
63 Xid ifxxid = null;
64 XAConnection db2xacon = null;
65 XAConnection ifxxacon = null;
66 XAResource db2xares = null;
67 XAResource ifxxares = null;
68
69
70 // read the properties
71 props = new Properties ();
72
73 try {
74 props.load (new FileInputStream (propertyfile));
75 }
76 catch (IOException io) {
77 System.err.println ("Error while accessing the properties file (" +
78 propertyfile + "). Abort.");
79 System.exit (1);
80 }
DBX 类仅仅包含一个私有成员,用于负责属性文件。在该文件中,有一些数据库特定的设置,例如到引擎的端口或登录信息。
该类的构造函数实例化了 SQL 和 XA 相关类:
- Connection: 表示到数据库的传统 SQL(JDBC)连接。
- DB2XADataSource 和 IfxXADataSource: 这些类包含到数据库的本地 XA 调用。使用这些类来启用两阶段提交协议(Two-Phase-Commit-Protocol)。如果有一个应用程序服务器(Application Server),就不需要在程序中处理这些类,因为应用程序服务器(Application Server)封装乐应用程序的这部分。
- Xid: 指一个 XA 事务。本例中,使用了两个不同的数据库,所以需要两个不同的 Xid —— 每个数据库连接(分支)一个。
- XAConnection: JTA 中的一部分。该类允许您启动(提交、准备提交 ...)分布式事务(Distributed Transaction)。
- XAResource: 该资源指的是应用程序服务器(Application Server)所提供的一个服务。同样,本例中,我们不使用应用程序服务器(Application Server)。因此,必须在该应用程序中进行创建和初始化。
83 db2ds = initDB2XADataSource ();
84 ifxds = initIfxXADataSource ();
这些代码行调用一个方法来设置 XADataSource(参见下面)。
360 IfxXADataSource initIfxXADataSource () {
361
362 System.out.print ("Create an IDS XA data source: ");
363 IfxXADataSource ds = new IfxXADataSource ();
364 ds.setDescription ("IDS XA data source");
365 ds.setServerName (props.getProperty ("ifx.connection.instancename"));
366 ds.setIfxIFXHOST (props.getProperty ("ifx.connection.host"));
367 ds.setPortNumber (Integer.parseInt
368 (props.getProperty ("ifx.connection.port")));
369 ds.setDatabaseName (props.getProperty ("ifx.connection.databasename"));
370
371 System.out.println ("Okay.");
372 return ds;
373 }
为了方便,这里同时演示了用于 XADataSource 的 IDS 和 DB2 设置,因为它们十分相似。
在安装 IfxDataSource(第 363 行)之后,需要将多个设置指定到数据源对象。这些设置是从属性文件读取的。在设置传统的 JDBC 数据库连接时,所做的这些设置可以与数据库 URL 相比。请注意,没有将任何登录信息指定给数据源对象。登录信息仍然是数据库连接本身中的一部分。
正如上面所提到的,如果存在应用程序服务器(Application Server),还可以由它来进行这一初始化。
在用正确的参数初始化 XADataSource 之后,就将 XADataSource 返回给方法调用者。
85 db2xacon = initDB2XAConnection (db2ds);
86 ifxxacon = initIfxXAConnection (ifxds);
在第 85 和 86 行的代码中,创建了到数据库的 XA Connection。下面描述了如何初始化这些 XA Connection。
329 XAConnection initIfxXAConnection (IfxXADataSource ifxdatasource) {
330
331 XAConnection xacon = null;
332
333
334 try {
335 System.out.print ("Set up IDS XA connection: ");
336 xacon = ifxdatasource.getXAConnection (
337 props.getProperty ("ifx.connection.username"),
338 props.getProperty ("ifx.connection.password"));
339
340 System.out.println ("Okay.");
341 }
342 catch (SQLException e) {
343 sqlerr (e);
344 }
345
346 return xacon;
347 }
为了设置 XAConnection,要使用前面初始化的 DataSource 对象。第 336 行使用 XADataSource 创建了 XAConnection。为了完成 XAConnection,只需要将身份验证信息传递给该对象。
87 db2xares = initXAResource (db2xacon);
88 ifxxares = initXAResource (ifxxacon);
现在,您准备创建 XAResource 对象了。这些对象将允许您操作两阶段提交(Two-Phase-Commit)。
388 XAResource initXAResource (XAConnection xacon) {
389
390 XAResource xares = null;
391
392
393 try {
394 System.out.print ("Setting up a XA resource: ");
395 xares = xacon.getXAResource ();
396 System.out.println ("Okay.");
397 }
398 catch (SQLException e) {
399 sqlerr (e);
400 }
401
402 return xares;
403 }
XAResource 对象的安装没有什么特别的。该对象是通过调用 XAConnection 中的 getXAResource() 来创建的。
在完成所有关于 XA 的准备之后,就创建到数据库的 JDBC 连接。
89 db2con = getDatabaseConnection (db2xacon);
90 ifxcon = getDatabaseConnection (ifxxacon);
在 getDatabaseConnection() 方法中,建立了一个 JDBC 数据库连接。
250 Connection getDatabaseConnection (XAConnection xacon) {
251
252 Connection con = null;
253
254 try {
255 System.out.print ("Establish database connection: ");
256 con = xacon.getConnection ();
257 System.out.println ("Okay.");
258 }
259 catch (SQLException e) {
260 sqlerr (e);
261 }
262
263 return con;
264 }
这看上去有些混乱。既然已经在第 336 行中设置了 XAConnection,我们为何还需要 JDBC 连接呢?我们为何仍然需要一个“传统”连接的理由是所有其他 JDBC 操作和类(Statement、ResultSet ...)都基于或使用 Connection 对象。如果您看一看 JDBC 类的层次结构图,将会发现 XAConnection 并非是 Connection ,反之亦然。XAConnection (实际上,它是 ConnectionPool 的子类)使用 Connection (层次化)。
93 db2xid = createDB2XID ();
94 ifxxid = createIfxXID ();
启动 XA 事务之前的最后一步就是为数据库创建 XA ID 对象。在分布式事务(Distributed Transaction)中进行操作时,总是要使用这个 xid。
183 Xid createIfxXID () {
184
185 Xid xid = null;
186
187 byte [] gid = new byte[1];
188 byte [] bid = new byte[1];
189
190 gid[0] =
191 (Byte.decode (props.getProperty ("xid.global"))).byteValue ();
192 bid[0] =
193 (Byte.decode (props.getProperty ("xid.branch.ifx"))).byteValue ();
194
195 System.out.print ("Creating an XID (" + Byte.toString (gid[0]) + ", " +
196 Byte.toString (bid[0]) + ") for Informix: ");
197
198 xid = new IfxXid (0, gid, bid);
199 System.out.println ("Okay.");
200 return xid;
201 }
createIfxXID 方法创建一个 XID(这里:用于 IDS 连接)。正如“两阶段提交协议简介”小节中提到的,XA 事务包含定义该事务的两个元素。上面例子中的重要部分在第 198 行中。IDS XID 是同三个参数创建的。第一个参数是 format ID,它描述在什么格式中构建分布式事务(Distributed Transaction)。您可以省略这一格式信息。第二个参数定义了全局事务 ID(global transaction ID)。该 ID 对于所有参与数据库来说是惟一的。第三个参数表示该全局事务中的事务分支。
在(为 DB2 和 IDS)构建 XID 之后,我们可以使用它们来修改单个事务中的数据。
98 execBranch (db2con, db2xares, db2xid);
99 execBranch (ifxcon, ifxxares, ifxxid);
execBranch() 方法包含了上面为每个连接所定义的 XA 事务中的修改。
上一页 [1] [2] [3] 下一页 [聊天工具]企业邮件系统的利器----FoxMail Server [系统软件]OPEN SERVER 5.0.5安装EXP300阵列柜 [系统软件]关于Windows2000Server的灾难恢复 [常用软件][网络]下载服务革命性风暴Poco Server评测 [C语言系列]动态创建SQL Server数据库、表、存储过程等架构信… [C语言系列]SQL Server到DB2连接服务器的实现 [C语言系列]SQL Server到SYBASE连接服务器的实现 [C语言系列]SQL Server到SQLBASE连接服务器的实现 [C语言系列]SQL Server连接VFP数据库的实现 [C语言系列]ASP+SQL Server之图象数据处理
|