談笑有鴻儒,往來無白丁

          在恰當(dāng)?shù)臅r(shí)間、地點(diǎn)以恰當(dāng)?shù)姆绞奖磉_(dá)給恰當(dāng)?shù)娜?..  閱讀的時(shí)候請注意分類,佛曰我日里面是談笑文章,其他是各個(gè)分類的文章,積極的熱情投入到寫博的隊(duì)伍中來,支持blogjava做大做強(qiáng)!向dudu站長致敬>> > 我的微博敬請收聽
          前言
          在銀行、電信、金融等行業(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 壞男孩 閱讀(912) 評論(0)  編輯  收藏 所屬分類: 資源整合
          主站蜘蛛池模板: 惠州市| 西林县| 五河县| 抚州市| 盈江县| 温宿县| 上犹县| 衡南县| 德安县| 方山县| 海兴县| 永嘉县| 阜阳市| 静安区| 信宜市| 武清区| 大渡口区| 平塘县| 孟连| 沙湾县| 锦州市| 苏州市| 仪征市| 阿鲁科尔沁旗| 宕昌县| 保山市| 双辽市| 景东| 彭州市| 扶余县| 江永县| 佳木斯市| 台湾省| 利津县| 太白县| 体育| 许昌市| 巴楚县| 左云县| 大余县| 永修县|