[转帖]Create Oracle tuxedo XA connection_MQ, Tuxedo及OLTP讨论区_Weblogic技术|Tuxedo技术|中间件技术|Oracle论坛|JAVA论坛|Linux/Unix技术|hadoop论坛_联动北方技术论坛  
网站首页 | 关于我们 | 服务中心 | 经验交流 | 公司荣誉 | 成功案例 | 合作伙伴 | 联系我们 |
联动北方-国内领先的云技术服务提供商
»  游客             当前位置:  论坛首页 »  自由讨论区 »  MQ, Tuxedo及OLTP讨论区 »
总帖数
1
每页帖数
101/1页1
返回列表
0
发起投票  发起投票 发新帖子
查看: 3260 | 回复: 0   主题: [转帖]Create Oracle tuxedo XA connection        下一篇 
tk
注册用户
等级:中士
经验:207
发帖:80
精华:0
注册:2011-10-19
状态:离线
发送短消息息给tk 加好友    发送短消息息给tk 发消息
发表于: IP:您无权察看 2014-12-26 9:25:56 | [全部帖] [楼主帖] 楼主

A. 修改tuxedo安装路径的udataobj目录下的RM文件,把以Oracle_XA:xaosw:开头的一行用#注释掉,并加入一行:

 Oracle_XA;xaosw;%ORACLE_HOME%\rdbms\xa\xa90.lib %ORACLE_HOME%\precomp\lib\msvc\orasql9.lib


B. 在TUXEDO下创建TMS文件:TMS_ORA,TUXEDO通过TMS_ORA与ORACLE数据库采用XA协议进行通讯

 buildtms -o TMS_ORA -r Oracle_XA


注意:
a. 如果TUXEDO 服务端与ORACLE数据库不在同一台服务器上,可能会提示找不到 库文件oraxa90.lib和orasql9.lib,可到ORACLE数据库的服务端相应目录下把这两个文件拷到当前机器ORACLE的客户端下的对应目录下。
b. TMS_ORA 是一个可执行的文件

C. 配置 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

D. 重命名下列文件,因为下列文件名与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

E. 用tmadmin创建TLOG文件,TUXEDO用一个文件TLOG记录对数据库操作的日志。用于协调分布式数据库的提交与回滚。

 D:\>tmadmin
>crdl -b 500 -z d:\test\TLOG
>crlog -m simple
Oracle_XA:xaosw:-L${ORACLE_HOME}/lib -lxa -lsql -lncr
-lsqlnet -lclient -lcommon -lgeneric -lcommon -lepc
-lnlsrtl3 -lc3v6 -lcore3 -lm -lsocket


• Oracle Tuxedo 12c简介
• Oracle WebLogic应用服务器 12c 新功能
• Spring Data JDBC Extensions with Oracle Database Support 1.0.0.RC4 发布
• SAP HANA 和 Oracle Exadata的比较
• 60天完成数据库Oracle Exadata迁移经验
• 北京南天招聘中间件工程师
• Oracle Service Bus条件分支的问题
• Oracle Service Bus和JMS Business Service的配置
• Oracle Service Bus和单元测试
• 请问在oracle service bus中如何同RabbitMQ或者ActiveMQ配置

其实网上已经有很多关于Tuxedo通过XA连接Oracle的文章了,这里参考着前人的文档结合自己的实验整理一下,只是作为记录,怕自己过几天忘了
实验环境:

 Windows XP Professional SP2
Tuxedo 8.1 32-bit RP303
Oracle 9i (9.2.0.8) for Windows,Schema:scott


1. 安装Oracle Client
在运行Tuxedo的主机上,至少要安装Oracle Client。如果是开发用,那么在安装的时候还需要选择"Oracle Programmer",该组件包含了Pro*C所需的头文件以及LIB包
2. 配置TNS别名
在运行Tuxedo的主机上,配置TNS别名,连接到Oracle。配置好之后,最好使用sqlplus命令测试一下,配置是否正确。我的实验TNS别名是laborcl
3. 创建XA相关视图
使用system或者其他DBA用户登录到Oracle,运行${ORACLE_HOME}\rdbms\admin\xaview.sql,该SQL脚本创建2个视图:v$pending_xatrans$ 和 v$xatrans$
4. 给XA相关视图授权
使用system或者其他DBA用户登录到Oracle,进行授权

 grant select on DBA_PENDING_TRANSACTIONS to public;
grant select on v$pending_xatrans$ to public;
grant select on v$xatrans$ to public;


5. 配置RM文件
编辑文件${TUXDIR}\udataobj\RM。该文件中已经包含了一个For Oracle 7的配置,要使用其他版本的Oracle数据库,则需要自行配置。

 Oracle 7 (RM自带):
Oracle_XA:xaosw:-L${ORACLE_HOME}/lib -lxa ${ORACLE_HOME}/lib/libsql.a -lora -lsqlnet -lcore -lnlsrtl -lcore ${ORACLE_HOME}/lib/osntab.o -lsqlnet -lcv6 -lora -lm -lsocket
Oracle 8i for NT:
Oracle_XA;xaosw;%ORACLE_HOME%RDBMSXAORAXA8.LIB %ORACLE_HOME%PRECOMPLIBMSVCORASQL8.LIB %ORACLE_HOME%PRECOMPLIBMSVCORASQX8.LIB %ORACLE_HOME%OCILIBMSVCOCI.LIB %ORACLE_HOME%OCILIBMSVCOCIW32.LIB
Oracle 8i for Unix:
Oracle_XA:xaosw:-L$/lib -lclntsh
Oracle 9i: Oracle_XA;xaosw;%ORACLE_HOME%\rdbms\XA\ORAXA9.LIB


其实RM文件主要是告诉buildtms命令在编译的时候要链接的库以及其他信息。这里需要注意的是在Windows平台上要使用分号(;)分隔,在Unix平台上要使用冒号( : )分隔,如果写错了,可能在buildtms的时候报出错误:

 GP_CAT:1102: ERROR: Cannot find RM Oracle_XA in file d:\bea\tux81\tuxedo8.1\udataobj\RM


并且注意环境变量的引用符号,在Windows上是一对%%,在Unix上是$符号。
6. buildtms
使用buildtms命令: buildtms -o TMS_ORA9i -r Oracle_XA
其中-o参数是输出的TMS可执行程序,-r就是在RM文件中的名称,即第一个分号前面的部分。可以将TMS输出文件放到APPDIR的目录下。
7. 编写简单的UBB配置文件

*RESOURCES
IPCKEY 48800
DOMAINID jadedom1
MASTER jade1
MAXACCESSERS 100
MAXSERVERS 50
MAXSERVICES 100
MODEL SHM
LDBAL Y
SCANUNIT 10
SANITYSCAN 6
BLOCKTIME 8
MAXGTT 10
*MACHINES
DEFAULT:
APPDIR="d:\MyCode\ProC\"
TUXCONFIG="d:\MyCode\ProC\tuxconfig"
TUXDIR="d:\bea\tux81\tuxedo8.1"
MAXWSCLIENTS=10
TLOGDEVICE="d:\mycode\ProC\MyTLOGDevice"
TLOGNAME=MYTLOG
TLOGSIZE=200
YYUAN01 LMID=jade1
*GROUPS
GROUP1
LMID=jade1 GRPNO=1
TMSCOUNT=2
TMSNAME="TMS_ORA9i"
OPENINFO="Oracle_XA:Oracle_XA+Acc=P/scott/tiger+SesTm=120+MaxCur=5+LogDir=.+SqlNet=laborcl"
CLOSEINFO="NONE"
*SERVERS
DEFAULT:
CLOPT="-A"
*SERVICES


其中GROUP段最重要的是OPENINFO串,Oracle几个版本的OPENINFO变化不大,其中P/scott/tiger分别是帐号和口令,如果要使用密文口令,则把口令部分填写为五个*,在tmloadcf的时候,要求手工输入:

 D:\MyCode\ProC>tmloadcf -y ubbdemo
Password for OPENINFO (SRVGRP=GROUP1):


tmunloadcf出来:

 OPENINFO="Oracle_XA:Oracle_XA+Acc=P/scott/@@75980d546f4248f1@@+SesTm=120+MaxCur=5+LogDir=.+SqlNet=laborcl"


这里可以看出OPENINFO中口令已经被加密。

OPENINFO中的SqlNet为你在tuxedo所在主机上配置的连接Oracle的TNS别名
TMSCOUNT参数默认为3,最小2,最大10。
然后使用tmloadcf编译ubb配置文件
8. 创建TLOG Device及TLOG
如果忘了创建TLOGDevice及TLOG,那么在tmboot的时候会出现如下错误:

 123357.YYUAN01!tmloadcf.2128.384.-2: 01-03-2008: Tuxedo Version 8.1, 32-bit
123357.YYUAN01!tmloadcf.2128.384.-2: CMDTUX_CAT:872: INFO: TUXCONFIG file d:\MyCode\ProC\tuxconfig has been updated
123906.YYUAN01!BBL.1936.3272.0: 01-03-2008: Tuxedo Version 8.1, 32-bit, Patch Level 303
123906.YYUAN01!BBL.1936.3272.0: LIBTUX_CAT:296: ERROR: _tlog_open: _gp_tblopen: VTOC not initialized
123906.YYUAN01!BBL.1936.3272.0: LIBTUX_CAT:319: ERROR: Log start cannot open tlog
123906.YYUAN01!BBL.1936.3272.0: LIBTUX_CAT:248: ERROR: System init function failed, Uunixerr =
123906.YYUAN01!BBL.1936.3272.0: CMDTUX_CAT:26: INFO: The BBL is exiting system
123906.YYUAN01!tmboot.2460.2916.-2: 01-03-2008: Tuxedo Version 8.1, 32-bit
123906.YYUAN01!tmboot.2460.2916.-2: CMDTUX_CAT:825: ERROR: Process BBL at jade1 failed with /T tperrno (TPESYSTEM - internal system error)
123906.YYUAN01!tmboot.2460.2916.-2: WARN: No BBL available on site jade1.
Will not attempt to boot server processes on that site.


使用tmadmin命令,此时由于Tuxedo尚未启动,所以可以看到No bulletin board exists. Entering boot mode.的信息

 > crdl -b 1024 -z d:\mycode\ProC\MyTLOGDevice


创建TLOG Device,这里-z要和UBB文件中的MACHINE段的TLOGDEVICE保持一致。block通常设置为RESOUCE段的MAXGTT+50,并且不小于MACHINE段的TLOGSIZE设置
然后创建TLOG:

 >crlog -m jade1


-m参数为主机的逻辑名称,即ubb中的MACHINE段的LMID。
9. 启动Tuxedo

 tmboot -y


启动之后就可以在Oracle看到从TMS_ORA9i连接的TMSCOUNT个Session了。

TUXEDO 9.0 for windows 与ORACLE 10g数据库的互连
系统说明
TUXEDO版本:9.1 安装目录C:\bea\tuxedo9.1
ORACLE版本:10.2.0.1 安装目录D:\oracle\product\10.2.0\db_1
操作系统: win2003 R2
配置的步骤
一、ORACLE的的配置
1.用internal用户(缺省的口令是oracle)进入SQLPLUS

 C:\>sqlplus system/manager


2.运行ORACLE的安装路径下的/rdbms/admin/xaview.sql

 SQL> @ D:\oracle\product\10.2.0\db_1\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;


如果出现

 113959.2352:536.536.1:
ORA-00942: table or view does not exist


则运行

 grant select on V$XATRANS$ to scott;
GRANT SELECT ON DBA_PENDING_TRANSACTIONS TO PUBLIC


二、TUXEDO的配置
1.修改TUXEDO安装路径的udataobj目录下的RM文件,把以Oracle_XA:xaosw:开头的一行用#注释掉,并加入一行:

 Oracle_XA;xaosw;D:\oracle\product\10.2.0\db_1\RDBMS\XA\oraxa10.lib D:\oracle\product\10.2.0\db_1\precomp\LIB\orasql10.lib


注意空格
如果是在UNIX环境下,则为:

 Oracle_XA:xaosw:-L${ORACLE_HOME}/lib -lclntsh


2. 在TUXEDO用户下创建TMS文件:TMS_ORA10g,TUXEDO通过TMS_ORA10g与ORACLE数据库采用XA协议进行通讯

 buildtms -o C:\bea\tuxedo9.1\bin\TMS_ORA10g -r Oracle_XA


注意:如果TUXEDO 服务端与ORACLE数据库不在同一台服务器上,可能会提示找不到 库文件oraxa10.lib和orasql10.lib,可到ORACLE数据库的服务端相应目录下把这两个文件拷到当前机器ORACLE的客户端下的对应目录下。
3. 配置 UBBCONFIG
(1)在*MACHINES节中增加:

 TLOGDEVICE = “C:\bea\tuxedo9.1\test\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_ORA10g" TMSCOUNT=2


修改后的配置文件ubb内容如下,用tmloadcf -y ubb重新生成tuxconfig

 IPCKEY 123456
DOMAINID simpapp
MASTER simple
MAXACCESSERS 100
MAXSERVERS 50
MAXSERVICES 100
MODEL SHM
LDBAL N
*MACHINES
server LMID=simple


注:server为Tuxedo server的计算机名称

 APPDIR="C:\bea\tuxedo9.1\test"
TUXCONFIG="C:\bea\tuxedo9.1\test\tuxconfig"
TUXDIR="d:\tux71"
TLOGDEVICE = "C:\bea\tuxedo9.1\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_ORA10g" TMSCOUNT=2
*SERVERS
DEFAULT:
CLOPT="-A"
test SRVGRP=GROUP1 SRVID=1
*SERVICES


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 C:\bea\tuxedo9.1\test\TLOG
>crlog -m simple
>q


三、服务端的程序: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=7900所对应的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,"7900");
      /*调用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文件

 C:\bea\tuxedo9.1\test> proc test.pc include=%TUXDIR%/include


2.用buildserver

把test.c编译成可执行文件,注意-r 后带的Oracle_XA 与RM文件中的一致。

 C:\bea\tuxedo9.1\test> buildserver -o test -f test.c -r Oracle_XA -s TEST


六、编译客户端程序

 C:\bea\tuxedo9.1\test> buildclient -o testcli -f testcli.c


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

 C:\bea\tuxedo9.1\test> tmboot -y
Booting admin processes ...
exec BBL -A :
process id=788 ... Started.
Exe
TMS_ORA10g-A :
process id=1072 ... Started.
exec TMS_ORA10g-A :
process id=528 ... Started.
exec test -A :
process id=876 ... Started.


八、运行客户端程序
运行后应能看到服务端返回的结果

C:\bea\tuxedo9.1\test> testcli
tpcall failed,tperrno=11,tperrtext=TPESVCFAIL - application level service failure


还是有错……
可能需要其他的Oracle proc的文件进行测试
ORACLE的其他版本的配置及在其他操作系统上的配置基本与本文所述差不多,差别主要在RM文件中所连的库文件可能会不样。

--转自 北京联动北方科技有限公司




赞(0)    操作        顶端 
总帖数
1
每页帖数
101/1页1
返回列表
发新帖子
请输入验证码: 点击刷新验证码
您需要登录后才可以回帖 登录 | 注册
技术讨论