tuxedo连接mysql_TUXEDO与INFORMIX数据库的互连
在兩層的C/S結構中,客戶端直接訪問數據庫,當采用TUXEDO中間件后,形成三層結構。這時,客戶端不直接訪問數據庫,而是改為調用中間件TUXEDO服務端上的服務,由TUXEDO服務端訪問數據庫,并把結果返回給客戶端
前言:
在兩層的C/S結構中,客戶端直接訪問數據庫,當采用TUXEDO中間件后,形成三層結構。這時,客戶端不直接訪問數據庫,而是改為調用中間件TUXEDO服務端上的服務,由TUXEDO服務端訪問數據庫,并把結果返回給客戶端。TUXEDO服務端可以和INformIX在同一臺服務器上,也可以在不同的機器上,如果在不同的機器上,在TUXEDO的服務端所在的機器要安裝一個INformIX的客戶端。
TUXEDO服務端與INformIX數據庫連接有兩種方式:
1、不通過XA接口直接互連。適用于整個系統只有一個數據庫的情況。
2、通過XA接口互連,對整個系統有一個數據庫或多個數據庫都適用,建議采用,本文介紹這種互連的配置方法。
系統說明:
TUXEDO: 版本TUXEDO6.5(是32位的)安裝在HP-UX 11.0 64bit上,安裝目錄 /usr/tuxedo
TUXEDO的例子: /usr/tuxedo/simpdb
INformIX: 版本INformIX9.21(是64位的)安裝在SCO Unix 5.0.5上,目錄 /INformIX
數據庫名稱: mydb
TUXEDO用戶名: TUXEDO
注意:TUXEDO系統與INformIX數據庫在不同的機器上,所以在TUXEDO系統所在的機器上要安裝INformIX數據庫的CLIENT端,并且如果TUXEDO系統是32位的,而INformIX數據庫的服務端是64是,在TUXEDO系統所在的機器上應安裝INformIX數據庫的32位的CLIENT端才行。
配置的步驟:
一、INformIX的的配置
1> 數據庫一定要以unbuffered log方式創建,create database databasename with log;
INformIX數據庫的LOG方式有3種:Buffered,Nobuffer,Unbuffered(under buffer)
用onmonitor命令可查看數據庫是否是用unbuffered log方式創建的,log status 那一列為U的是unbuffered log方式。
用ontape -s –L 0 –U databasename;可把一個其他方式創建的數據庫改為unbuffered log方式的.
2>tuxedo用戶應該有訪問該數據庫資源的權限。grant dba to tuxedo;
如果TUXEDO用戶沒有訪問該數據庫資源的權限,當TUXEDO啟動時,TMS啟動會失敗,在ULOG中會出現類似下面的錯誤信息:
145053.rs6000!BBL.17510: LIBTUX_CAT:262: INFO: Standard main starting
145053.rs6000!TMS_INformIX.20204: 020602: TUXEDO Version 6.5 AIX 2 4 007025954C00.
145053.rs6000!TMS_INformIX.20204: LIBTUX_CAT:262: INFO: Standard main starting
145054.rs6000!TMS_INformIX.20204: LIBTUX_CAT:466: ERROR: tpopen TPERMERR xa_open returned XAER_RMERR
145054.rs6000!TMS_INformIX.20204: LIBTUX_CAT:250: ERROR: tpsvrinit() failed
145054.rs6000!TMS_INformIX.20204: LIBTUX_CAT:300: ERROR: _tlog_open: _gp_tblopen
145054.rs6000!TMS_INformIX.20204: LIBTUX_CAT:250: ERROR: tpsvrinit() failed
145054.rs6000!TMS_INformIX.20204: LIBTUX_CAT:300: ERROR: _tlog_open: _gp_tblopen: UNIX sys call error - 2
145054.rs6000!tmboot.19178: 020602: TUXEDO Version 6.5 AIX 2 4 007025954C00.
145054.rs6000!tmboot.19178: CMDTUX_CAT:825: ERROR: Process TMS_INformIX at simple failed with /T tperrno (TPERMERR - resource manager error)
二、TUXEDO的配置
1. /usr/tuxedo/simpdb/setenv的內容:
. usr/tuxedo/tux.env
INformIXDIR=/tmp_mnt/informix/hc; export INformIXDIR
INformIXSERVER=dhc; export INformIXSERVER
PATH=$TUXDIR/bin:$INformIXDIR/bin:/bin:/usr/bin:/usr/ccs/bin:.; export PATH
SHLIB_PATH=$SHLIB_PATH:$INformIXDIR/lib:$INformIXDIR/lib/esql:$INformIXDIR/lib
/cli:$INformIXDIR/lib/c++
:$INformIXDIR/lib/client:$INformIXDIR/lib/dmi:/usr/lib:/usr/lib/Motif1.2
INCLUDE=$INformIXDIR/incl/esql:$INformIXDIR/incl:/tuxedo/include:/usr/include; export INCLUDE
CFLAGS="-I$INformIXDIR/incl -I$INformIXDIR/incl/esql" export CFLAGS
2.重命名下列文件,因為下列文件名與INformIX中的文件名有沖突,所以要改名。
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
3. 修改TUXEDO安裝路徑的udataobj目錄下的RM文件,加入:
INformIX-DSHC:infx_xa_switch:-L/tuxedo/lib -L${INformIXDIR}/lib -L${INformIXDIR}/lib/esql -lifxa -lifsql -lifasf -lifgen -lifos -lifgls -lnsl -lm -lsec ${INformIXDIR}/lib/esql/checkapi.o -lifglx
4. 在TUXEDO用戶下創建TMS文件:TMS_INformIX,TUXEDO通過TMS_INformIX與INformIX數據庫采用XA協議進行通訊
buildtms -r INformIX-DSHC -o /tuxedo/bin/TMS_INformIX
5. 配置 UBBCONFIG
1. 在*MACHINES節中增加:
TLOGDEVICE = "/usr/tuxedo/simpdb/TLOG"
TLOGNAME=TLOG
TLOGSIZE=200
2. 改*GROUPS節的配置為:
*GROUPS
GROUP1 LMID=simple GRPNO=1
TMSNAME="TMS_INformIX" TMSCOUNT=2
OPENINFO="INformIX-DSHC:mydb"
修改后的配置文件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="/usr/tuxedo/simpdb"
TUXCONFIG="/usr/tuxedo/simpdb/tuxconfig"
TUXDIR="/usr/tuxedo"
TLOGDEVICE = "/usr/tuxedo/simpdb/TLOG"
TLOGNAME=TLOG
TLOGSIZE=100
*GROUPS
GROUP1 LMID=simple GRPNO=1
TMSNAME="TMS_INformIX" TMSCOUNT=2
OPENINFO="INformIX-DSHC:mydb"
*SERVERS
DEFAULT:
CLOPT="-A"
test SRVGRP=GROUP1 SRVID=1
*SERVICES
6.用TMADMIN創建TLOG文件,TUXEDO用一個文件TLOG記錄對數據庫操作的日志。用于協調分布式數據庫的提交與回滾.
D:>tmadmin
>crdl -b 500 -z /usr/tuxedo/simpdb/TLOG
>crlog -m simple
>q
三、服務端的程序:test.cp
功能:根據客戶端傳的EMPNO到表EMP中取ENAME的值,并把它返回給客戶端
#i nclude
#i nclude
#i nclude
#i nclude
#i nclude
#i nclude
EXEC SQL INCLUDE sqlca;
EXEC SQL BEGIN DECLARE SECTION;
long al_empno=0;
char ac_ename[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,sqlca.sqlcode=%ldn",sqlca.sqlcode);
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的值,并顯示出來
#i nclude
#i nclude "atmi.h"
main(argc, argv)
{
long reqlen=1024;
char *reqbuf;
/* 與TUXEDO服務端建立連接 */
if (tpinit((TPINIT *) NULL) == -1)
{
(void) fprintf(stderr, "Tpinit failedn");
exit(1);
}
/* 分配發送緩沖區*/
reqbuf = (char *)tpalloc("STRING",NULL,reqlen);
if ( reqbuf == (char *)NULL)
{
printf("tpalloc failedn");
tpterm();
}
strcpy(reqbuf,"1000");
/*調用TUXEDO的服務TEST*/
if (tpcall("TEST", (char *)reqbuf, 0L, (char **)&reqbuf, (long *)&reqlen, 0< 0 )
{
printf("tpcall failed,tperrno=%ld,tperrtext=%sn",tperrno,tpstrerror(tperrno));
tpfree(reqbuf);
tpterm();
exit(1);
}
printf("name=%sn",reqbuf);
tpfree(reqbuf);
tpterm();
return(0);
}
五、編譯服務端程序
1.用INformIX的esql把test.pc 文件預編譯成test.c文件
/usr/tuxedo/simpdb/esql -c test.pc -I$INformIXDIR/incl/esql
2.用buildserver把test.c編譯成可執行文件,注意-r 后帶的INformIX-DSHC與RM文件中的一致。
/usr/tuxedo/simpdb/buildserver -o simpserv -f simpserver.c -r INformIX-DSHC -s TEST
六、編譯客戶端程序
/usr/tuxedo/simpdb/buildclient -o testcli -f testcli.c
七、用 tmboot –y 啟動TUXEDO,應能看到所有的SERVER都啟動成功.這時,我們的服務端程序test 會自動與INformIX數據庫建立連接,并一直保持這個連接,直到TUXEDO系統或INformIX數據庫關閉.所以在我們的程序test.cp中看不到與數據庫連接的語句,因為現在與數據庫的連接由TUXEDO自動管理.
/usr/tuxedo/simpdb/ tmboot -y
exec TMS_INformIX -A :
process id=1072 ... Started.
exec TMS_INformIX -A :
process id=528 ... Started.
exec test -A :
process id=876 ... Started.
八、運行客戶端程序,應能看到服務端返回的結果
/usr/tuxedo/simpdb/ testcli
name=bill
到此,整個配置過程就大功告成了.INformIX的其他版本的配置及在其他操作系統上的配置基本與本文所述差不多,差別主要在RM文件中所連的庫文件可能會不樣.使用esql -libs 命令得到應用所需的數據庫動態連接庫.再加上INformIX支持XA的庫libinfxxa.a,注意在INformIX9.13之后,libinfxxa.a 的名字變了,不支持多線程的為libifxa.a,支持多線程的為libthxa.a。
如在環境為:AIX 4.3.3, Tuxedo7.1, Informix Dynamic Server 9.21, Esql/C 9.51 中RM為:
INformIX-ONLINE:infx_xa_switch:${INformIXDIR}/lib/esql/libifxa.a -L${INformIXDIR}/lib -L${INformIXDIR}/lib/esql -lifsql -lifasf -lifgen -lifos -lifgls -lnetstub -lc_r -ldl -ltli_r -lm_r ${INformIXDIR}/lib/esql/checkapi.o -lifglx
在環境為:AIX 4.3.3, Tuxedo6.5, Informix7.3中RM為:
INformIX-OnLine:infx_xa_switch:${INformIXDIR}/lib/esql/libinfxxa.a -L${INformIXDIR}/lib -L${INformIXDIR}/lib/esql -lixsqlshr -lixasfshr -lixgenshr -lixosshr -lixglsshr ${INformIXDIR}/lib/esql/checkapi.o -lixglx
如果TMS_INformIX啟動不成功,查看ULOG文件,根據ULOG文件的信息進行排錯.
作者:徐春金????轉貼自:http://www.91talk.net
發表評論
標題(可選)
內容*
驗證碼*
 
稱呼*
郵箱地址(可選)
個人主頁(可選)
總結
以上是生活随笔為你收集整理的tuxedo连接mysql_TUXEDO与INFORMIX数据库的互连的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 博图如何读取mysql数据_博途使用小结
- 下一篇: mysql随机显示记录_MySQL随机读