Windows下Tuxedo的安裝與配置-數據庫
一、準備數據庫環境
這裏使用的是Linux+Oracle9的虛擬機數據庫環境。本機配置Tuxedo服務器。在上篇無數據庫配置
基礎上,配置Tuxedo服務器連接Oracle理解起來就相對簡單了。這裏採用XA方式連接數據庫。
二、準備客戶端,服務端的應用程序
這裏是自已寫的代碼。
client.c
#include <stdio.h>
#include <atmi.h> /* TUXEDO Header File */
main(int argc, char *argv[])
{
char *sendbuf;
long sendlen=1024;
int ret;
if(argc != 2) {
(void) fprintf(stderr, "args not exist\n");
exit(1);
}
/* 與服務器建立連接 */
if (tpinit((TPINIT *) NULL) == -1)
{
(void) fprintf(stderr, "Tpinit failed\n");
exit(1);
}
/* 分配發送緩衝 */
sendbuf = (char *) tpalloc("STRING", NULL, sendlen);
if (sendbuf== (char *)NULL)
{
(void) fprintf(stderr,"Error allocating send buffer\n");
tpterm();
exit(1);
}
(void) strcpy(sendbuf, argv[1]);
(void) fprintf(stdout, "InputValue: %s\n", argv[1]);
/* 向服務發送請求 */
ret = tpcall("DBSERV", (char *)sendbuf, 0L, (char **)&sendbuf, &sendlen, 0L);
if(ret == -1) {
(void) fprintf(stderr, "Can't send request to service DBREAD\n");
(void) fprintf(stderr, "Tperrno = %d\n", tperrno);
tpfree(sendbuf);
tpterm();
exit(1);
}
(void) fprintf(stdout, "Returned string is: %s\n", sendbuf);
/* Free Buffers & Detach from System/T */
tpfree(sendbuf);
tpterm();
return(0);
}
server.pc 這裏用到了ProC的一些方法
#include <stdio.h>
#include <ctype.h>
#include <atmi.h> /* TUXEDO Header File */
#include <userlog.h> /* TUXEDO Header File */
EXEC SQL INCLUDE sqlca;
EXEC SQL BEGIN DECLARE SECTION;
VARCHAR ora_no[2];
VARCHAR ora_value[10];
EXEC SQL END DECLARE SECTION;
DBREAD(TPSVCINFO *rqst)
{
strcpy(ora_no.arr,(char *)rqst->data);
ora_no.len=strlen(ora_no.arr);
ora_no.arr[ora_no.len]='\0';
userlog("ERRSRV: %s",ora_no.arr);
EXEC SQL select name into :ora_value from tuxedo_test where id=:ora_no;
if(sqlca.sqlcode!=0)
{
userlog("ERRSRV: select name from tuxedo_test where id=, sqlcode=%ld \n",sqlca.sqlcode);
tpreturn(TPFAIL, 0, rqst->data, 0L, 0);
}
strcpy(rqst->data,ora_value.arr);
tpreturn(TPSUCCESS, 0, rqst->data, 0L, 0);
}
三、編譯客戶端,服務端代碼
buildclient -o client -f client.c -v
對pc文件,須首先編譯爲c,然後再編譯爲服務。在proc編譯的過程,會出現link錯誤,這是因爲tuxedo本身
帶的sqlca.h與oracle proc衝突,將C:\bea\tuxedo9.0\include\sqlca.h改名即可。
proc server.pc include=%TUXDIR%/include
buildserver -o server -f server.c -r Oracle_XA -s DBREAD -v
四、配置Tuxedo的RM文件
本地Tuxedo9.0安裝路徑爲C:\bea\tuxedo9.0。
打開C:\bea\tuxedo9.0\udataobj路徑下的rm文件。找到Oracle_XA:這句,可以註釋掉,然後增加下面內容。
Oracle_XA;xaosw;E:\oracle\ora92\rdbms\XA\ORAXA9.LIB E:\oracle\ora92\precomp\lib\orasql9.lib
注:本機如果沒有裝服務版的Oracle,可能找不到對應庫文件,可從服務器端複製過來即可。
這兩個lib是用於編譯tms文件的,tuxedo通過TMS_ORA9i與Oracle數據庫進行XA通訊。
修改完rm文件,運行命令buildtms -o C:\bea\tuxedo9.0\bin\TMS_ORA9i -r Oracle_XA編譯生成TMS_ORA9i。
五、修改ubbconfig文件
在*GROUP下添加下面語句。liwei/liwei@linux是連接數據庫的tns配置。TMSCOUNT=2表示啓動兩個TMS服務。
OPENINFO="Oracle_XA:Oracle_XA+Acc=P/liwei/liwei+SqlNet=linux+SesTm=600+MaxCur=5+LogDir=."
TMSNAME="TMS_ORA9i" TMSCOUNT=2
另外在*MACHINES添加日誌的處理,語句如下。
TLOGDEVICE = "F:\Liwei\Tuxedo\dbread\TLOG"
TLOGNAME = TLOG
TLOGSIZE = 100
因爲編譯的服務文件名是server,*SERVERS下改爲server
因爲生成的服務是DBREAD,所以*SERVICES下也要改成DBREAD。
修改後文件如下:
#Liwei
*RESOURCES
IPCKEY 123456
DOMAINID liweiapp
MASTER lw
MAXACCESSERS 5
MAXSERVERS 5
MAXSERVICES 5
MODEL SHM
LDBAL N
*MACHINES
LWYM
LMID = lw
TUXDIR = "C:\bea\tuxedo9.0"
TUXCONFIG = "F:\Liwei\Tuxedo\dbread\tuxconfig"
APPDIR = "F:\Liwei\Tuxedo\dbread"
TLOGDEVICE = "F:\Liwei\Tuxedo\dbread\TLOG"
TLOGNAME=TLOG
TLOGSIZE = 100
#ULOGPFX = "F:\Liwei\Tuxedo\dbread\ULOG"
*GROUPS
GROUP1 LMID=lw GRPNO = 1
OPENINFO="Oracle_XA:Oracle_XA+Acc=P/liwei/liwei+SqlNet=linux+SesTm=600+MaxCur=5+LogDir=."
TMSNAME="TMS_ORA9i" TMSCOUNT=2
*SERVERS
DEFAULT:
CLOPT="-A"
server SRVGRP=GROUP1 SRVID=1
*SERVICES
DBREAD
編譯日誌後不能立刻tmboot運行,需要先用tmadmin創建TLOG。方法如下:
C:\>tmadmin
>crdl -b 500 -z F:\Liwei\Tuxedo\dbread\TLOG
>crlog -m lw
注:lw是ubbconfig裏面的LMID。
六、Oracle的設置
Linux:
sqlplus /nolog
conn sys/*** as sysdba
執行xaview.sql 創建v$xatrans$和 v$pending_xatrans$兩個視圖
@...../rdbms/admin/xaview.sql
並把兩個視圖的select權限授給連接用戶如liwei。
grant select on v$xatrans$ to liwei with grant option;
grant select on v$pending_xatrans$ to liwei with grant option;
最後
grant select any table to liwei;
七、運行tmboot
你會發現有個TMS_ORA9i啓動不起來,沒關係,將*RESOURCES max系列的設大點,tmshutdown,並且
結束掉tuxipc,重新編譯config然後tmboot就ok了。
client 1
執行就會返回數據庫結果了。
這裏使用的是Linux+Oracle9的虛擬機數據庫環境。本機配置Tuxedo服務器。在上篇無數據庫配置
基礎上,配置Tuxedo服務器連接Oracle理解起來就相對簡單了。這裏採用XA方式連接數據庫。
二、準備客戶端,服務端的應用程序
這裏是自已寫的代碼。
client.c
#include <stdio.h>
#include <atmi.h> /* TUXEDO Header File */
main(int argc, char *argv[])
{
char *sendbuf;
long sendlen=1024;
int ret;
if(argc != 2) {
(void) fprintf(stderr, "args not exist\n");
exit(1);
}
/* 與服務器建立連接 */
if (tpinit((TPINIT *) NULL) == -1)
{
(void) fprintf(stderr, "Tpinit failed\n");
exit(1);
}
/* 分配發送緩衝 */
sendbuf = (char *) tpalloc("STRING", NULL, sendlen);
if (sendbuf== (char *)NULL)
{
(void) fprintf(stderr,"Error allocating send buffer\n");
tpterm();
exit(1);
}
(void) strcpy(sendbuf, argv[1]);
(void) fprintf(stdout, "InputValue: %s\n", argv[1]);
/* 向服務發送請求 */
ret = tpcall("DBSERV", (char *)sendbuf, 0L, (char **)&sendbuf, &sendlen, 0L);
if(ret == -1) {
(void) fprintf(stderr, "Can't send request to service DBREAD\n");
(void) fprintf(stderr, "Tperrno = %d\n", tperrno);
tpfree(sendbuf);
tpterm();
exit(1);
}
(void) fprintf(stdout, "Returned string is: %s\n", sendbuf);
/* Free Buffers & Detach from System/T */
tpfree(sendbuf);
tpterm();
return(0);
}
server.pc 這裏用到了ProC的一些方法
#include <stdio.h>
#include <ctype.h>
#include <atmi.h> /* TUXEDO Header File */
#include <userlog.h> /* TUXEDO Header File */
EXEC SQL INCLUDE sqlca;
EXEC SQL BEGIN DECLARE SECTION;
VARCHAR ora_no[2];
VARCHAR ora_value[10];
EXEC SQL END DECLARE SECTION;
DBREAD(TPSVCINFO *rqst)
{
strcpy(ora_no.arr,(char *)rqst->data);
ora_no.len=strlen(ora_no.arr);
ora_no.arr[ora_no.len]='\0';
userlog("ERRSRV: %s",ora_no.arr);
EXEC SQL select name into :ora_value from tuxedo_test where id=:ora_no;
if(sqlca.sqlcode!=0)
{
userlog("ERRSRV: select name from tuxedo_test where id=, sqlcode=%ld \n",sqlca.sqlcode);
tpreturn(TPFAIL, 0, rqst->data, 0L, 0);
}
strcpy(rqst->data,ora_value.arr);
tpreturn(TPSUCCESS, 0, rqst->data, 0L, 0);
}
三、編譯客戶端,服務端代碼
buildclient -o client -f client.c -v
對pc文件,須首先編譯爲c,然後再編譯爲服務。在proc編譯的過程,會出現link錯誤,這是因爲tuxedo本身
帶的sqlca.h與oracle proc衝突,將C:\bea\tuxedo9.0\include\sqlca.h改名即可。
proc server.pc include=%TUXDIR%/include
buildserver -o server -f server.c -r Oracle_XA -s DBREAD -v
四、配置Tuxedo的RM文件
本地Tuxedo9.0安裝路徑爲C:\bea\tuxedo9.0。
打開C:\bea\tuxedo9.0\udataobj路徑下的rm文件。找到Oracle_XA:這句,可以註釋掉,然後增加下面內容。
Oracle_XA;xaosw;E:\oracle\ora92\rdbms\XA\ORAXA9.LIB E:\oracle\ora92\precomp\lib\orasql9.lib
注:本機如果沒有裝服務版的Oracle,可能找不到對應庫文件,可從服務器端複製過來即可。
這兩個lib是用於編譯tms文件的,tuxedo通過TMS_ORA9i與Oracle數據庫進行XA通訊。
修改完rm文件,運行命令buildtms -o C:\bea\tuxedo9.0\bin\TMS_ORA9i -r Oracle_XA編譯生成TMS_ORA9i。
五、修改ubbconfig文件
在*GROUP下添加下面語句。liwei/liwei@linux是連接數據庫的tns配置。TMSCOUNT=2表示啓動兩個TMS服務。
OPENINFO="Oracle_XA:Oracle_XA+Acc=P/liwei/liwei+SqlNet=linux+SesTm=600+MaxCur=5+LogDir=."
TMSNAME="TMS_ORA9i" TMSCOUNT=2
另外在*MACHINES添加日誌的處理,語句如下。
TLOGDEVICE = "F:\Liwei\Tuxedo\dbread\TLOG"
TLOGNAME = TLOG
TLOGSIZE = 100
因爲編譯的服務文件名是server,*SERVERS下改爲server
因爲生成的服務是DBREAD,所以*SERVICES下也要改成DBREAD。
修改後文件如下:
#Liwei
*RESOURCES
IPCKEY 123456
DOMAINID liweiapp
MASTER lw
MAXACCESSERS 5
MAXSERVERS 5
MAXSERVICES 5
MODEL SHM
LDBAL N
*MACHINES
LWYM
LMID = lw
TUXDIR = "C:\bea\tuxedo9.0"
TUXCONFIG = "F:\Liwei\Tuxedo\dbread\tuxconfig"
APPDIR = "F:\Liwei\Tuxedo\dbread"
TLOGDEVICE = "F:\Liwei\Tuxedo\dbread\TLOG"
TLOGNAME=TLOG
TLOGSIZE = 100
#ULOGPFX = "F:\Liwei\Tuxedo\dbread\ULOG"
*GROUPS
GROUP1 LMID=lw GRPNO = 1
OPENINFO="Oracle_XA:Oracle_XA+Acc=P/liwei/liwei+SqlNet=linux+SesTm=600+MaxCur=5+LogDir=."
TMSNAME="TMS_ORA9i" TMSCOUNT=2
*SERVERS
DEFAULT:
CLOPT="-A"
server SRVGRP=GROUP1 SRVID=1
*SERVICES
DBREAD
編譯日誌後不能立刻tmboot運行,需要先用tmadmin創建TLOG。方法如下:
C:\>tmadmin
>crdl -b 500 -z F:\Liwei\Tuxedo\dbread\TLOG
>crlog -m lw
注:lw是ubbconfig裏面的LMID。
六、Oracle的設置
Linux:
sqlplus /nolog
conn sys/*** as sysdba
執行xaview.sql 創建v$xatrans$和 v$pending_xatrans$兩個視圖
@...../rdbms/admin/xaview.sql
並把兩個視圖的select權限授給連接用戶如liwei。
grant select on v$xatrans$ to liwei with grant option;
grant select on v$pending_xatrans$ to liwei with grant option;
最後
grant select any table to liwei;
七、運行tmboot
你會發現有個TMS_ORA9i啓動不起來,沒關係,將*RESOURCES max系列的設大點,tmshutdown,並且
結束掉tuxipc,重新編譯config然後tmboot就ok了。
client 1
執行就會返回數據庫結果了。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.