zoukankan      html  css  js  c++  java
  • TUXEDO与ORACLE数据库的互连

       TUXEDO与ORACLE数据库的互连


        在两层的C/S结构中,客户端直接访问数据库,当采用TUXEDO中间件后,形成三层结构。这时,客户端不直接访问数据库,而
    是改为调用中间件TUXEDO服务端上的服务,由TUXEDO服务端访问数据库,并把结果返回给客户端。TUXEDO服务端可以和ORACLE在同
    一台服务器上,也可以在不同的机器上,如果在不同的机器上,在TUXEDO的服务端所在的机器要安装一个ORACLE的客户端。
       TUXEDO服务端与ORACLE数据库连接有两种方式:
       1、不通过XA接口直接互连。适用于整个系统只有一个数据库的情况。
       2、通过XA接口互连,对整个系统有一个数据库或多个数据库都适用,建议采用,本文介绍这种互连的配置方法。

    系统说明:
        TUXEDO版本:7.1    安装目录 d:\tuxedo71
        ORACLE版本:8.1.5 安装目录 d:\ora81
        操作系统: win2000

    配置的步骤:

    一、ORACLE的的配置
         如果是9I,请用:sys/change_on_install
        1.用internal用户(缺省的口令是oracle)进入SQLPLUS
           C:\>sqlplus internal/oracle
        2.运行ORACLE的安装路径下的/rdbms/admin/xaview.sql
           SQL> @d:\ora81\rdbms\admin\xaview.sql
        3.授权
           SQL>grant select on v$xatrans$ to public with grant option;
           SQL>grant select on v$pending_xatrans$ to public with grant option;
        4.    用system用户(缺省的口令是manager)连接并授权
        SQL>connect system/manager
        SQL>grant select any table to public;

    二、TUXEDO的配置
        1.    修改TUXEDO安装路径的udataobj目录下的RM文件,把以Oracle_XA:xaosw:开头的一行用#注释掉,并加入一行:
            Oracle_XA;xaosw;d:\ora81\rdbms\xa\oraxa8.lib d:\ora81\precomp\lib\msvc\orasql8.lib
            如果是在UNIX环境下,则为:
            Oracle_XA:xaosw:-L${ORACLE_HOME}/lib -lclntsh
        2. 在TUXEDO用户下创建TMS文件:TMS_ORA8i,TUXEDO通过TMS_ORA8i与ORACLE数据库采用XA协议进行通讯
        buildtms -o d:\tuxedo71\bin\TMS_ORA8i -r Oracle_XA
       
          注意:如果TUXEDO 服务端与ORACLE数据库不在同一台服务器上,可能会提示找不到 库文件oraxa8.lib和orasql8.lib,
          可到ORACLE数据库的服务端相应目录下把这两个文件拷到当前机器ORACLE的客户端下的对应目录下.
        3. 配置 UBBCONFIG
        1. 在*MACHINES节中增加:
            TLOGDEVICE = "/home/oracle/temp/simpdb/TLOG"
            TLOGNAME=TLOG
            TLOGSIZE=200
        2. 改*GROUPS节的配置为:(scott/tiger为本数据库所采用的用户及口令,可根据需要更改)
            *GROUPS
            GROUP1 LMID=simple    GRPNO=1
            OPENINFO="Oracle_XA:Oracle_XA+Acc=P/scott/tiger+SesTm=600+MaxCur=5+LogDir=."
            TMSNAME="TMS_ORA8i"    TMSCOUNT=2
            修改后的配置文件ubb内容如下,用tmloadcf -y ubb重新生成tuxconfig
        *RESOURCES
        IPCKEY        123456
        DOMAINID    simpapp
        MASTER        simple
        MAXACCESSERS    100
        MAXSERVERS    50
        MAXSERVICES    100
        MODEL        SHM
        LDBAL        N

        *MACHINES
        server        LMID=simple
                APPDIR="d:\test"
                TUXCONFIG="d:\test\tuxconfig"
                TUXDIR="d:\tux71"
                TLOGDEVICE = "d:\test\TLOG"
                TLOGNAME=TLOG
                TLOGSIZE=100
        *GROUPS
            GROUP1     LMID=simple    GRPNO=1
            OPENINFO="Oracle_XA:Oracle_XA+Acc=P/scott/tiger+SesTm=600+MaxCur=5+LogDir=."
            TMSNAME="TMS_ORA8i"    TMSCOUNT=2
        *SERVERS
            DEFAULT:
                CLOPT="-A"
            test    SRVGRP=GROUP1 SRVID=1
        *SERVICES

       说明:OPENINFO的含义:

    TMSNAME=TMS_ORABANKB1     GRPNO=1         OPENINFO="Oracle_XA:Oracle_XA+Acc=P/user1/PaSsWd1+SesTm=0+LogDir=."[Oracle_XA + required fields: Acc=P/oracle_user_id/oracle_password + SesTm=Session_time_limit (maximum time a transaction can be inactive) + optional fields: LogDir=logdir (where XA library trace file is located) + MaxCur=maximum_#_of_open cursors + SqlNet=connect_string (if Oracle exists over the network) (eg. SqlNet=hqfin@NEWDB indicates the database with sid=NEWDB accessed at host hqfin by TCP/IP)]BANKB2     GRPNO=2    OPENINFO="Oracle_XA:Oracle_XA+Acc=P/user2/PaSsWd2+SesTm=0+LogDir=."BANKB3     GRPNO=3OPENINFO="Oracle_XA:Oracle_XA+Acc=P/user3/PaSsWd3+SesTm=0+LogDir=."

    with some platform you should add SQLNet=*** in OPENINFO


    sqlnet:
    当用SQLPLUS连数据库要加@SID才能与数据库连接时,在OPENINFO中要加上SqlNet=jifei1
    jifei1为数据库的SID
    否则:XA*.TRC中会有:
    xaolgn_help:XAER_RMERR:OCIServerAttach failer. ORA-12154
    ORA-12154: TNS: 无法处理服务名


    OPENINFO="Oracle_XA:Oracle_XA+Acc=P/bill/ac6c69626+SqlNet=jifei1+SesTM=120+LogDir=.+MaxCur=100"
       
       4.重命名下列文件,因为下列文件名与ORACLE带的文件名有冲突,所以要改名。
         1.TUXEDO安装路径include目录下的下面文件
             把sqlca.h 改名为 sqlca.h.bbb
             把sqlcode.h 改名为 sqlcode.h.bbb
             把sqlda.h 改名为 sqlda.h.bbb
         2.重命名TUXEDO安装路径lib目录下的下面文件
           把libsql.lib 改名为 libsql.lib.bbb
       5.用TMADMIN创建TLOG文件,TUXEDO用一个文件TLOG记录对数据库操作的日志。用于协调分布式数据库的提交与回滚.
         D:\>tmadmin
         >crdl -b 500 -z d:\test\TLOG
         >crlog -m simple
         >q


    *SERVERS
    "DMADM" SRVGRP="TDOMGRP"        SRVID=1
            CLOPT="-A -t --" //增加
            RQPERM=0666     REPLYQ=N        RPPERM=0666     MIN=1   MAX=1   CONV=N
            SYSTEM_ACCESS=FASTPATH
            MAXGEN=200      GRACE=86400     RESTART=Y
            MINDISPATCHTHREADS=0    MAXDISPATCHTHREADS=1    THREADSTACKSIZE=0
            SICACHEENTRIESMAX="500"


    三、服务端的程序:test.pc
        功能:根据客户端传的EMPNO到表EMP中取ENAME的值,并把它返回给客户端
    #include <stdio.h>
    #include <atmi.h>
    #include <userlog.h>

    EXEC SQL INCLUDE sqlca;

    EXEC SQL BEGIN DECLARE SECTION;
        long al_empno=0;
        char ac_ename[11]="";
       
        EXEC SQL VAR ac_ename         IS STRING(11);   
    EXEC SQL END DECLARE SECTION;


    TEST(TPSVCINFO *rqst)
    {

        /*接收客户端来的数据*/
        al_empno = (FBFR32 *)rqst->data;
       
        EXEC SQL select ename into :ac_ename from EMP where empno=:al_empno;
        if(sqlca.sqlcode!=0)
        {
            userlog("select from EMP failure,sqlcode=%ld, sqlerr=%s\n",sqlca.sqlcode,(char *)sqlca.sqlerrm.sqlerrmc);
            strcpy(rqst->data,sqlca.sqlerrm.sqlerrmc);
            tpreturn( TPFAIL, 0, rqst->data, 0, 0 );
        }
        /*把取出的结果返回给客户端*/
        strcpy(rqst->data,ac_ename);
        tpreturn( TPSUCCESS, 0, rqst->data, 0, 0 );
    }


    四、编写客户端程序: testcli.c
        功能:调用TUXEDO服务端的服务TEST,取EMPNO=1000所对应的ENAME的值,并显示出来
    #include <stdio.h>
    #include "atmi.h"       

    main(argc, argv)
    {
        long reqlen=1024;
        char *reqbuf;
       
        /* 与TUXEDO服务端建立连接 */
        if (tpinit((TPINIT *) NULL) == -1)
        {
            (void) fprintf(stderr, "Tpinit failed\n");
            exit(1);
        }
        /* 分配发送缓冲区*/
        reqbuf = (char *)tpalloc("STRING",NULL,reqlen);
        if ( reqbuf == (char *)NULL)
        {
            printf("tpalloc failed\n");
            tpterm();
        }
        strcpy(reqbuf,"1000");
        /*调用TUXEDO的服务TEST*/
        if (tpcall("TEST", (char *)reqbuf, 0L, (char **)&reqbuf, (long *)&reqlen, 0< 0 )
        {
            printf("tpcall failed,tperrno=%ld,tperrtext=%s\n",tperrno,tpstrerror(tperrno));
            tpfree(reqbuf);
            tpterm();
            exit(1);
        }
        printf("name=%s\n",reqbuf);
        tpfree(reqbuf);
        tpterm();
        return(0);
    }


    五、编译服务端程序
       1.用ORACLE的PROC把test.pc 文件预编译成test.c文件
         d:\test> proc test.pc include=%TUXDIR%/include
       2.用buildserver把test.c编译成可执行文件,注意-r 后带的Oracle_XA 与RM文件中的一致。
         d:\test> buildserver -o simpserv -f simpserver.c -r Oracle_XA -s TEST

    六、编译客户端程序
        d:\test> buildclient -o testcli -f testcli.c

    七、用 tmboot –y 启动TUXEDO,应能看到所有的SERVER都启动成功.这时,我们的服务端程序test 会自动与ORACLE数据库建立连接,
        并一直保持这个连接,直到TUXEDO系统或ORACLE数据库关闭.所以在我们的程序test.pc中看不到与数据库连接的语句,因为现在与
        数据库的连接由TUXEDO自动管理.如果TMS_ORA8i启动失败会在当前目录生成一个*.trc文件,记录失败的原因,同时TUXEDO的ULOG
        文件中也会有一些错误信息.可参考这些错误信息.进行错误分析.
        d:\test> tmboot -y
        exec TMS_ORA8i-A :
            process id=1072 ... Started.
        exec TMS_ORA8i-A :
            process id=528 ... Started.
       exec test -A :
            process id=876 ... Started.

    八、运行客户端程序,应能看到服务端返回的结果
       d:\test> testcli
       name=bill

    到此,整个配置过程就大功告成了.ORACLE的其他版本的配置及在其他操作系统上的配置基本与本文所述差不多,差别主要在RM文件中所
    连的库文件可能会不样.


    使用XA的一些注意事项和技巧

    Oracle的参数调整
    1> 在Oracle 8.0以前的版本(包括Oracle 8.0 !)执行xaview.sql,并将DBA_PENDING_TRANSACTIONS的SELECT权限授给所有用户;
    2> 在Oracle的初始化init文件中,distributed_transactions的默认值很小(一般为10),需要根据业务并发量提高到上百;


    Tuxedo的配置技巧
    1> 在TMS中Oracle的OPENINFO,SesTm的值不要小于任何一个tpbegin()中的超时参数;
    2> 将做长时间查询的服务与执行快速更新的服务分开,部署到不同的进程,以免前者阻塞后者;
    3> 如果发现TMS的排对很长,请多起几个TMS的GROUP来分散请求.
    4> 如果在TUXEDO SERVICE中调用ORACLE存储过程,在存储过程中不要有COMMIT语句,否则会发生:   sqlcode=-2089,szerrtext=ORA-02089: COMMIT 不允许在附属会话中
       存储过程中的事务无法成为全局事务的一部分。


    Tuxedo 7.1



    Used on Solaris 8



    Database is Oracle 8.1.7
    Customer has many questions about tuxedo. Especially the ORA-03113 error and TMS_ORA startup slowly.



    Have given all the answers to customer. After set “hash_join_enable=false”, ORA-03113 error disappears now.

    After set “timeout in tpbegin() < SesTm < distributed_lock_timeout”, TMS_ORA hanging problem didn’t occurred again.



    China team manager, Mr. Xiao Hua is now visiting customer and on site.



    : to start TNS:

    lsnrctl start

  • 相关阅读:
    getline函数
    Java获取某年某月的第一天
    计划任务中使用NT AUTHORITYSYSTEM用户和普通管理员用户有什么差别
    Windows 7系统安装MySQL5.5.21图解
    C#高性能大容量SOCKET并发(十一):编写上传client
    Linux 终端訪问 FTP 及 上传下载 文件
    完毕port(CompletionPort)具体解释
    ping不通的几种可能原因
    Apple Swfit UI控件实现
    js中取session的值
  • 原文地址:https://www.cnblogs.com/danghuijian/p/4400898.html
Copyright © 2011-2022 走看看