tuxedo连接mysql_TUXEDO与INFORMIX数据库的互连
在兩層的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é)果返回給客戶端
前言:
在兩層的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ù)端可以和INformIX在同一臺(tái)服務(wù)器上,也可以在不同的機(jī)器上,如果在不同的機(jī)器上,在TUXEDO的服務(wù)端所在的機(jī)器要安裝一個(gè)INformIX的客戶端。
TUXEDO服務(wù)端與INformIX數(shù)據(jù)庫連接有兩種方式:
1、不通過XA接口直接互連。適用于整個(gè)系統(tǒng)只有一個(gè)數(shù)據(jù)庫的情況。
2、通過XA接口互連,對(duì)整個(gè)系統(tǒng)有一個(gè)數(shù)據(jù)庫或多個(gè)數(shù)據(jù)庫都適用,建議采用,本文介紹這種互連的配置方法。
系統(tǒng)說明:
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
數(shù)據(jù)庫名稱: mydb
TUXEDO用戶名: TUXEDO
注意:TUXEDO系統(tǒng)與INformIX數(shù)據(jù)庫在不同的機(jī)器上,所以在TUXEDO系統(tǒng)所在的機(jī)器上要安裝INformIX數(shù)據(jù)庫的CLIENT端,并且如果TUXEDO系統(tǒng)是32位的,而INformIX數(shù)據(jù)庫的服務(wù)端是64是,在TUXEDO系統(tǒng)所在的機(jī)器上應(yīng)安裝INformIX數(shù)據(jù)庫的32位的CLIENT端才行。
配置的步驟:
一、INformIX的的配置
1> 數(shù)據(jù)庫一定要以u(píng)nbuffered log方式創(chuàng)建,create database databasename with log;
INformIX數(shù)據(jù)庫的LOG方式有3種:Buffered,Nobuffer,Unbuffered(under buffer)
用onmonitor命令可查看數(shù)據(jù)庫是否是用unbuffered log方式創(chuàng)建的,log status 那一列為U的是unbuffered log方式。
用ontape -s –L 0 –U databasename;可把一個(gè)其他方式創(chuàng)建的數(shù)據(jù)庫改為unbuffered log方式的.
2>tuxedo用戶應(yīng)該有訪問該數(shù)據(jù)庫資源的權(quán)限。grant dba to tuxedo;
如果TUXEDO用戶沒有訪問該數(shù)據(jù)庫資源的權(quán)限,當(dāng)TUXEDO啟動(dòng)時(shí),TMS啟動(dòng)會(huì)失敗,在ULOG中會(huì)出現(xiàn)類似下面的錯(cuò)誤信息:
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的內(nèi)容:
. 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.重命名下列文件,因?yàn)橄铝形募cINformIX中的文件名有沖突,所以要改名。
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用戶下創(chuàng)建TMS文件:TMS_INformIX,TUXEDO通過TMS_INformIX與INformIX數(shù)據(jù)庫采用XA協(xié)議進(jìn)行通訊
buildtms -r INformIX-DSHC -o /tuxedo/bin/TMS_INformIX
5. 配置 UBBCONFIG
1. 在*MACHINES節(jié)中增加:
TLOGDEVICE = "/usr/tuxedo/simpdb/TLOG"
TLOGNAME=TLOG
TLOGSIZE=200
2. 改*GROUPS節(jié)的配置為:
*GROUPS
GROUP1 LMID=simple GRPNO=1
TMSNAME="TMS_INformIX" TMSCOUNT=2
OPENINFO="INformIX-DSHC:mydb"
修改后的配置文件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="/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創(chuàng)建TLOG文件,TUXEDO用一個(gè)文件TLOG記錄對(duì)數(shù)據(jù)庫操作的日志。用于協(xié)調(diào)分布式數(shù)據(jù)庫的提交與回滾.
D:>tmadmin
>crdl -b 500 -z /usr/tuxedo/simpdb/TLOG
>crlog -m simple
>q
三、服務(wù)端的程序:test.cp
功能:根據(jù)客戶端傳的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)
{
/*接收客戶端來的數(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,sqlca.sqlcode=%ldn",sqlca.sqlcode);
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所對(duì)應(yīng)的ENAME的值,并顯示出來
#i nclude
#i nclude "atmi.h"
main(argc, argv)
{
long reqlen=1024;
char *reqbuf;
/* 與TUXEDO服務(wù)端建立連接 */
if (tpinit((TPINIT *) NULL) == -1)
{
(void) fprintf(stderr, "Tpinit failedn");
exit(1);
}
/* 分配發(fā)送緩沖區(qū)*/
reqbuf = (char *)tpalloc("STRING",NULL,reqlen);
if ( reqbuf == (char *)NULL)
{
printf("tpalloc failedn");
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=%sn",tperrno,tpstrerror(tperrno));
tpfree(reqbuf);
tpterm();
exit(1);
}
printf("name=%sn",reqbuf);
tpfree(reqbuf);
tpterm();
return(0);
}
五、編譯服務(wù)端程序
1.用INformIX的esql把test.pc 文件預(yù)編譯成test.c文件
/usr/tuxedo/simpdb/esql -c test.pc -I$INformIXDIR/incl/esql
2.用buildserver把test.c編譯成可執(zhí)行文件,注意-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 啟動(dòng)TUXEDO,應(yīng)能看到所有的SERVER都啟動(dòng)成功.這時(shí),我們的服務(wù)端程序test 會(huì)自動(dòng)與INformIX數(shù)據(jù)庫建立連接,并一直保持這個(gè)連接,直到TUXEDO系統(tǒng)或INformIX數(shù)據(jù)庫關(guān)閉.所以在我們的程序test.cp中看不到與數(shù)據(jù)庫連接的語句,因?yàn)楝F(xiàn)在與數(shù)據(jù)庫的連接由TUXEDO自動(dòng)管理.
/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.
八、運(yùn)行客戶端程序,應(yīng)能看到服務(wù)端返回的結(jié)果
/usr/tuxedo/simpdb/ testcli
name=bill
到此,整個(gè)配置過程就大功告成了.INformIX的其他版本的配置及在其他操作系統(tǒng)上的配置基本與本文所述差不多,差別主要在RM文件中所連的庫文件可能會(huì)不樣.使用esql -libs 命令得到應(yīng)用所需的數(shù)據(jù)庫動(dòng)態(tài)連接庫.再加上INformIX支持XA的庫libinfxxa.a,注意在INformIX9.13之后,libinfxxa.a 的名字變了,不支持多線程的為libifxa.a,支持多線程的為libthxa.a。
如在環(huán)境為: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
在環(huán)境為: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啟動(dòng)不成功,查看ULOG文件,根據(jù)ULOG文件的信息進(jìn)行排錯(cuò).
作者:徐春金????轉(zhuǎn)貼自:http://www.91talk.net
發(fā)表評(píng)論
標(biāo)題(可選)
內(nèi)容*
驗(yàn)證碼*
 
稱呼*
郵箱地址(可選)
個(gè)人主頁(可選)
總結(jié)
以上是生活随笔為你收集整理的tuxedo连接mysql_TUXEDO与INFORMIX数据库的互连的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 博图如何读取mysql数据_博途使用小结
- 下一篇: java 算法_JAVA经典算法40题