談笑有鴻儒,往來無白丁

          在恰當的時間、地點以恰當的方式表達給恰當的人...  閱讀的時候請注意分類,佛曰我日里面是談笑文章,其他是各個分類的文章,積極的熱情投入到寫博的隊伍中來,支持blogjava做大做強!向dudu站長致敬>> > 我的微博敬請收聽
          前言
          在銀行、電信、金融等行業的大型計算機應用系統中,中間件的使用日益普及,中間件已與操作系統、數據庫并列為三大基礎軟件。BEA Tuxedo作為最優秀的中間件產品,在我國的很多行業中廣泛使用,本文通過一個簡單的例子介紹如何在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的的配置
          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
          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.重命名下列文件,因為下列文件名與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
          ?
          三、服務端的程序: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文件中所連的庫文件可能會不樣。


          忘記從哪里搞來的,不過也是中間件的使用,看看吧留著以后用
          posted on 2006-09-15 15:02 壞男孩 閱讀(912) 評論(0)  編輯  收藏 所屬分類: 資源整合
          主站蜘蛛池模板: 福贡县| 锦屏县| 晋州市| 眉山市| 榆社县| 香港 | 盐源县| 阿拉善盟| 阳城县| 达日县| 荆门市| 隆尧县| 太康县| 迁西县| 安福县| 阿拉尔市| 碌曲县| 双城市| 扎兰屯市| 象州县| 梁河县| 色达县| 台南县| 四子王旗| 玛纳斯县| 台湾省| 全州县| 高淳县| 兴化市| 武乡县| 蒲城县| 仪陇县| 宿州市| 萨迦县| 南安市| 门头沟区| 麻栗坡县| 平遥县| 松江区| 九龙县| 新民市|