前言
在銀行、電信、金融等行業(yè)的大型計(jì)算機(jī)應(yīng)用系統(tǒng)中,中間件的使用日益普及,中間件已與操作系統(tǒng)、數(shù)據(jù)庫并列為三大基礎(chǔ)軟件。BEA Tuxedo作為最優(yōu)秀的中間件產(chǎn)品,在我國的很多行業(yè)中廣泛使用,本文通過一個(gè)簡單的例子介紹如何在TUXEDO中訪問ORACLE數(shù)據(jù)庫。
在兩層的C/S結(jié)構(gòu)中,客戶端直接訪問數(shù)據(jù)庫,當(dāng)采用TUXEDO中間件后,形成三層結(jié)構(gòu)。這時(shí),客戶端不直接訪問數(shù)據(jù)庫,而是改為調(diào)用中間件TUXEDO服務(wù)端上的服務(wù),由TUXEDO服務(wù)端訪問數(shù)據(jù)庫,并把結(jié)果返回給客戶端。TUXEDO服務(wù)端可以和ORACLE在同一臺服務(wù)器上,也可以在不同的機(jī)器上,如果在不同的機(jī)器上,在TUXEDO的服務(wù)端所在的機(jī)器要安裝一個(gè)ORACLE的客戶端。
TUXEDO服務(wù)端與ORACLE數(shù)據(jù)庫連接有兩種方式:
1、不通過XA接口直接互連。適用于整個(gè)系統(tǒng)只有一個(gè)數(shù)據(jù)庫的情況。
2、通過XA接口互連,對整個(gè)系統(tǒng)有一個(gè)數(shù)據(jù)庫或多個(gè)數(shù)據(jù)庫都適用,建議采用,本文介紹這種互連的配置方法。
系統(tǒng)說明
TUXEDO版本:7.1 安裝目錄 d:\tuxedo71
ORACLE版本:8.1.5 安裝目錄 d:\ora81
操作系統(tǒng): win2000
配置的步驟
一、ORACLE的的配置
1.用internal用戶(缺省的口令是oracle)進(jìn)入SQLPLUS
C:\>sqlplus internal/oracle
2.運(yùn)行ORACLE的安裝路徑下的/rdbms/admin/xaview.sql
SQL> @d:\ora81\rdbms\admin\xaview.sql
3.授權(quán)
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)連接并授權(quán)
SQL>connect system/manager
SQL>grant select any table to public;
二、TUXEDO的配置
1.修改TUXEDO安裝路徑的udataobj目錄下的RM文件,把以O(shè)racle_XA:xaosw:開頭的一行用#注釋掉,并加入一行:
Oracle_XA;xaosw;d:\ora81\rdbms\xa\oraxa8.lib d:\ora81\precomp\lib\msvc\orasql8.lib
如果是在UNIX環(huán)境下,則為:
Oracle_XA:xaosw:-L${ORACLE_HOME}/lib -lclntsh
2. 在TUXEDO用戶下創(chuàng)建TMS文件:TMS_ORA8i,TUXEDO通過TMS_ORA8i與ORACLE數(shù)據(jù)庫采用XA協(xié)議進(jìn)行通訊
buildtms -o d:\tuxedo71\bin\TMS_ORA8i -r Oracle_XA
?
注意:如果TUXEDO 服務(wù)端與ORACLE數(shù)據(jù)庫不在同一臺服務(wù)器上,可能會提示找不到 庫文件oraxa8.lib和orasql8.lib,可到ORACLE數(shù)據(jù)庫的服務(wù)端相應(yīng)目錄下把這兩個(gè)文件拷到當(dāng)前機(jī)器ORACLE的客戶端下的對應(yīng)目錄下。
3. 配置 UBBCONFIG
(1)在*MACHINES節(jié)中增加:
TLOGDEVICE = "/home/oracle/temp/simpdb/TLOG"
TLOGNAME=TLOG
TLOGSIZE=200
(2)改*GROUPS節(jié)的配置為:(scott/tiger為本數(shù)據(jù)庫所采用的用戶及口令,可根據(jù)需要更改)
*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內(nèi)容如下,用tmloadcf -y ubb重新生成tuxconfig
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
?
4.重命名下列文件,因?yàn)橄铝形募cORACLE帶的文件名有沖突,所以要改名。
(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創(chuàng)建TLOG文件,TUXEDO用一個(gè)文件TLOG記錄對數(shù)據(jù)庫操作的日志。用于協(xié)調(diào)分布式數(shù)據(jù)庫的提交與回滾。
D:\>tmadmin
>crdl -b 500 -z d:\test\TLOG
>crlog -m simple
>q
?
三、服務(wù)端的程序:test.pc
功能:根據(jù)客戶端傳的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)
{
?
/*接收客戶端來的數(shù)據(jù)*/
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 );
}
/*把取出的結(jié)果返回給客戶端*/
strcpy(rqst->data,ac_ename);
tpreturn( TPSUCCESS, 0, rqst->data, 0, 0 );
}
四、編寫客戶端程序: testcli.c
功能:調(diào)用TUXEDO服務(wù)端的服務(wù)TEST,取EMPNO=1000所對應(yīng)的ENAME的值,并顯示出來
#include <stdio.h>
#include "atmi.h"?
?
main(argc, argv)
{
long reqlen=1024;
char *reqbuf;
?
/* 與TUXEDO服務(wù)端建立連接 */
if (tpinit((TPINIT *) NULL) == -1)
{
(void) fprintf(stderr, "Tpinit failed\n");
exit(1);
}
/* 分配發(fā)送緩沖區(qū)*/
reqbuf = (char *)tpalloc("STRING",NULL,reqlen);
if ( reqbuf == (char *)NULL)
{
printf("tpalloc failed\n");
tpterm();
}
strcpy(reqbuf,"1000");
/*調(diào)用TUXEDO的服務(wù)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);
}
五、編譯服務(wù)端程序
1.用ORACLE的PROC把test.pc 文件預(yù)編譯成test.c文件
d:\test> proc test.pc include=%TUXDIR%/include
2.用buildserver把test.c編譯成可執(zhí)行文件,注意-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
應(yīng)能看到所有的SERVER都啟動成功。這時(shí),我們的服務(wù)端程序test 會自動與ORACLE數(shù)據(jù)庫建立連接,并一直保持這個(gè)連接,直到TUXEDO系統(tǒng)或ORACLE數(shù)據(jù)庫關(guān)閉。所以在我們的程序test.pc中看不到與數(shù)據(jù)庫連接的語句,因?yàn)楝F(xiàn)在與數(shù)據(jù)庫的連接由TUXEDO自動管理。如果TMS_ORA8i啟動失敗會在當(dāng)前目錄生成一個(gè)*.trc文件,記錄失敗的原因,同時(shí)TUXEDO的ULOG文件中也會有一些錯(cuò)誤信息。可參考這些錯(cuò)誤信息進(jìn)行錯(cuò)誤分析。
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.
八、運(yùn)行客戶端程序
運(yùn)行后應(yīng)能看到服務(wù)端返回的結(jié)果。
d:\test> testcli
name=bill
到此,整個(gè)配置過程就大功告成了。ORACLE的其他版本的配置及在其他操作系統(tǒng)上的配置基本與本文所述差不多,差別主要在RM文件中所連的庫文件可能會不樣。
忘記從哪里搞來的,不過也是中間件的使用,看看吧留著以后用
posted on 2006-09-15 15:02
壞男孩 閱讀(911)
評論(0) 編輯 收藏 所屬分類:
資源整合