转至繁体中文版     | 网站首页 | 图文教程 | 资源下载 | 站长博客 | 图片素材 | 武汉seo | 武汉网站优化 | 
最新公告:     敏韬网|教学资源学习资料永久免费分享站!  [mintao  2008年9月2日]        
您现在的位置: 学习笔记 >> 图文教程 >> 数据库 >> SyBase >> 正文
Informix Dynamic Server 中的分布式事务         ★★★★

Informix Dynamic Server 中的分布式事务

作者:闵涛 文章来源:闵涛的学习笔记 点击数:2030 更新时间:2009/4/22 23:09:35
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)连接。
  • DB2XADataSourceIfxXADataSource: 这些类包含到数据库的本地 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之图象数据处理
教程录入:mintao    责任编辑:mintao 
  • 上一篇教程:

  • 下一篇教程:
  • 【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
      注:本站部分文章源于互联网,版权归原作者所有!如有侵权,请原作者与本站联系,本站将立即删除! 本站文章除特别注明外均可转载,但需注明出处! [MinTao学以致用网]
      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)

    同类栏目
    · Sql Server  · MySql
    · Access  · ORACLE
    · SyBase  · 其他
    更多内容
    热门推荐 更多内容
  • 没有教程
  • 赞助链接
    更多内容
    闵涛博文 更多关于武汉SEO的内容
    500 - 内部服务器错误。

    500 - 内部服务器错误。

    您查找的资源存在问题,因而无法显示。

    | 设为首页 |加入收藏 | 联系站长 | 友情链接 | 版权申明 | 广告服务
    MinTao学以致用网

    Copyright @ 2007-2012 敏韬网(敏而好学,文韬武略--MinTao.Net)(学习笔记) Inc All Rights Reserved.
    闵涛 投放广告、内容合作请Q我! E_mail:admin@mintao.net(欢迎提供学习资源)

    站长:MinTao ICP备案号:鄂ICP备11006601号-18

    闵涛站盟:医药大全-武穴网A打造BCD……
    咸宁网络警察报警平台