【IT168
服务器学院】TUXEDO服务端与ORACLE数据库连接有两种方式:
1、不通过XA接口直接互连。适用于整个系统只有一个数据库的情况。
2、通过XA接口互连,对整个系统有一个数据库或多个数据库都适用,建议采用,本文介绍这种互连的配置方法。
系统说明
TUXEDO版本:8.1 安装目录 /export/home/tuxedo/tuxedo8.1
ORACLE版本:8.1.7 安装操作系统: winxp ip=192.168.5.129 port=1521
配置的步骤
一、ORACLE的的配置
1.在xp下用internal用户(缺省的口令是oracle)进入SQLPLUS(实际上可能只有system可以用,可以用sql plus worksheet登录)
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
如果是在UNIX环境下,则为:
buildtms -o /export/home/tuxedo/tuxedo8.1/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+sqlNet=TEST+Acc=
P/scott/tiger+SesTm=600+MaxCur=5+LogDir=."
TMSNAME="TMS_ORA8i" TMSCOUNT=2
修改后的配置文件ubb内容如下,用tmloadcf -y ubb重新生成tuxconfig
ubbsimple
*RESOURCES
IPCKEY 200000
#Example:
#IPCKEY 123456
DOMAINID simpapp
MASTER simple
MAXACCESSERS 10
MAXSERVERS 5
MAXSERVICES 10
MODEL SHM
LDBAL N
*MACHINES
DEFAULT:
APPDIR="/export/home/tuxapp/bin"
TUXCONFIG="/export/home/tuxapp/bin/tuxconfig"
TUXDIR="/export/home/tuxedo/tuxedo8.1"
TLOGDEVICE = "/export/home/tuxapp/log/TLOG"
TLOGNAME=TLOG
TLOGSIZE=200
ULOGPFX="/export/home/tuxapp/log/ULOG"
gkk LMID=simple
#Example:
#
bea(
促销产品主营产品)tux LMID=simple
*GROUPS
GROUP1
LMID=simple GRPNO=1 OPENINFO=NONE
OPENINFO="Oracle_XA:Oracle_XA+SqlNet=GKK_192.168.5.129+Acc=
P/system/manager+SesTm=600+MaxCur=5+LogDir=."
TMSNAME="TMS_ORA8i" TMSCOUNT=2
*SERVERS
DEFAULT:
CLOPT="-A"
simpserv SRVGRP=GROUP1 SRVID=1
testserv SRVGRP=GROUP1 SRVID=2
*SERVICES
#TOUPPER
#TEST
ubbsimple end
说明:
1、GKK_192.168.5.129
关联于oracle客户端的:OraHome_1/network/admin/tnsnames.ora
tnsnames.ora
GKK_192.168.5.129 =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.5.129)(PORT = 1521))
)
(CONNECT_DATA = (SID = gkk)(SERVER = DEDICATED))
)
tnsnames.ora end
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记录对数据库操作的日志。用于协调分布式数据库的提交与回滚。
$tmadmin
>crdl -b 500 -z /export/home/tuxapp/log/TLOG 记得之前要创建log目录
>crlog -m simple
>q
此时若想启动tuxedo成功的话必须设置oracle的一些环境变量:
.profile
ORACLE_HOME=/export/home/oracle/OraHome_1
ORACLE_BASE=/export/home/oracle
ORACLE_SID=gkk
export ORACLE_BASE ORACLE_SID ORACLE_HOME
.profile end
三、服务端的程序: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
unix 下: proc test.pc include=$TUXDIR/include
2.用buildserver把test.c编译成可执行文件,注意-r 后带的Oracle_XA 与RM文件中的一致。
d:\test> buildserver -o simpserv -f test.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.
execTEST -A :
process id=876 ... Started.
八、运行客户端程序
运行后应能看到服务端返回的结果。
d:\test> testcli
name=bill
到此,整个配置过程就大功告成了。ORACLE的其他版本的配置及在其他操作系统上的配置基本与本文所述差不多,差别主要在RM文件中所连的库文件可能会不样。