热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

TUXEDO与INFORMIX数据库的互连

前言:在两层的CS结构中,客户端直接访问数据库,当采用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$/lib -L$/lib/esql -lifxa -lifsql -lifasf -lifgen -lifos -lifgls -lnsl -lm -lsec $/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的值,并把它返回给客户端
#include
#include
#include
#include
#include
#include


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的值,并显示出来
#include
#include "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:$/lib/esql/libifxa.a -L$/lib -L$/lib/esql -lifsql -lifasf -lifgen -lifos -lifgls -lnetstub -lc_r -ldl -ltli_r -lm_r $/lib/esql/checkapi.o -lifglx

在环境为:AIX 4.3.3, Tuxedo6.5, Informix7.3中RM为:
INFORMIX-OnLine:infx_xa_switch:$/lib/esql/libinfxxa.a -L$/lib -L$/lib/esql -lixsqlshr -lixasfshr -lixgenshr -lixosshr -lixglsshr $/lib/esql/checkapi.o -lixglx

如果TMS_INFORMIX启动不成功,查看ULOG文件,根据ULOG文件的信息进行排错.
关于AIX操作系统下系统接口程序移植问题的报告
[开发环境]
操作系统AIX4.3.3、中间件TUXEDO6.5、数据库INFORMIX ESQL 7.24.UC8、开发语言ESQL/C
[环境变量]
#INFORMIX
export INFORMIXDIR=/usr/users/informix
export INFORMIXSERVER=online100
export OnCONFIG=onconfig.100
export TERM=vt100
export TERMCAP=$INFORMIXDIR/etc/termcap
export DB_LOCALE=en_US.8859-1@qmlu
export CLIENT_LOCALE=en_US.8859-1@qmlu
export PATH=$PATH:$INFORMIXDIR/bin:$INFORMIXDIR/lib:$INFORMIXDIR/lib/esql:$HOME/tools/bin:.

#TUXEDO
export TUXDIR=/usr/users/tuxedo
export PATH=$PATH:$TUXDIR/bin:$PATH
COBCPY=:$TUXDIR/cobinclude; export COBCPY
BOPT="-C ANS85 -C ALIGN=8 -C NOIBMCOMP -C TRUNC=ANSI -C OSEXT=cbl"; export COBOPT
PATH=$PATH:$INFORMIXDIR/bin:/usr/ibmcxx/bin
export PATH
export LIBPATH=$TUXDIR/lib:$INFORMIXDIR/lib:$INFORMIXDIR/lib/esql:/lib:/usr/lib:
$INFORMIXDIR/incl/esql:$LIBPATH

OSTYPE=AIX;export OSTYPE
[编译文件]
#城综网与业务系统接口的makefile文件
LIBDEP = $(HOME)/lib/SubTrx.a $(HOME)/lib/libmiddleware.a $(HOME)/lib/libsbsapi.a
LINKLIB =-L/usr/users/informix/lib/esql -L/usr/users/informix/lib -lc -lm -ll
OBJ = cs_trans.o pub.o
BINPATH=$(HOME)/bin
CFLAGS= -EDmCltSys -c
CCOPT= -qchars=signed -qcpluscmt -DHIGHFIRST -bstatic
all: $(BINPATH)/cs_trans
$(BINPATH)/cs_trans: $(OBJ)
buildclient -w -o $(HOME)/bin/cs_trans -f "$(OBJ) $(LIBDEP) $(LINKLIB)"
rm -f cs_trans.o
rm -f pub.o
cs_trans.o: cs_trans.ec
esql -I$(HOME)/inc -I$(TUXDIR)/include $(CFLAGS) $(CCOPT) cs_trans.ec
rm -f cs_trans.c
pub.o: pub.ec
[标准输出]
esql -I/usr/DATAS/zqywsrc/inc -I/usr/users/tuxedo/include -EDmCltSys -c -qchars=signed -qcpluscmt -DHIGHFIRST -bstatic cs_trans.ec
rm -f cs_trans.c
esql -I/usr/DATAS/zqywsrc/inc/ -EDmCltSys -c -qchars=signed ?qcpluscmt -DHIGHFIRST -bstatic pub.ec
rm -f pub.c
buildclient -w -o /usr/DATAS/zqywsrc/bin/cs_trans -f "cs_trans.o pub.o
/usr/DATAS/zqywsrc/lib/SubTrx.a /usr/DATAS/zqywsrc/lib/libmiddleware.a /usr/DATAS/zqywsrc/lib/libsbsapi.a -L/usr/users/informix/lib/esql -L/usr/users/informix/lib -lc -lm -ll"
[错误输出]
"cs_trans.ec", line 315.69: 1506-280 (W) Function argument assignment between types "unsigned long*" and "int*" is not allowed.
"pub.ec", line 386.13: 1506-068 (W) Operation between types "signed char*" and "int" is not allowed.
ld: 0711-317 ERROR: Undefined symbol: ._iqdbase
ld: 0711-317 ERROR: Undefined symbol: SQLCODE
ld: 0711-317 ERROR: Undefined symbol: ._iqstmnt
ld: 0711-317 ERROR: Undefined symbol: ._iqdbclose
ld: 0711-317 ERROR: Undefined symbol: ._iqslct
ld: 0711-317 ERROR: Undefined symbol: .sqldetach
ld: 0711-317 ERROR: Undefined symbol: ._iqnprep
ld: 0711-317 ERROR: Undefined symbol: sqlca
ld: 0711-317 ERROR: Undefined symbol: ._iqlocate_cursor
ld: 0711-317 ERROR: Undefined symbol: ._iqdescribe
ld: 0711-317 ERROR: Undefined symbol: .rtypmsize
ld: 0711-317 ERROR: Undefined symbol: .rtypalign
ld: 0711-317 ERROR: Undefined symbol: ._iqcddcl
ld: 0711-317 ERROR: Undefined symbol: ._iqdcopen
ld: 0711-317 ERROR: Undefined symbol: ._iqcftch
ld: 0711-317 ERROR: Undefined symbol: .dectoasc
ld: 0711-317 ERROR: Undefined symbol: .rdatestr
ld: 0711-317 ERROR: Undefined symbol: .stleng
ld: 0711-317 ERROR: Undefined symbol: ._iqclose
ld: 0711-317 ERROR: Undefined symbol: ._iqfree
ld: 0711-317 ERROR: Undefined symbol: ._iqexecute
ld: 0711-317 ERROR: Undefined symbol: .rdefmtdate
ld: 0711-317 ERROR: Undefined symbol: ._iqbeginwork
ld: 0711-317 ERROR: Undefined symbol: ._iqcdcl
ld: 0711-317 ERROR: Undefined symbol: ._iqcommit
ld: 0711-317 ERROR: Undefined symbol: .rfmtdate
ld: 0711-317 ERROR: Undefined symbol: ._iqrollback
ld: 0711-345 Use the -bloadmap or -bnoquiet option to obtain more information.
CMDTUX_CAT:512: ERROR: Cannot execute C compiler cc -I$TUXDIR/include -o /usr/DATAS/zqywsrc/bin/cs_trans -L$/lib cs_trans.o pub.o /usr/DATAS/zqywsrc/lib/SubTrx.a /usr/DATAS/zqywsrc/lib/libmiddleware.a /usr/DATAS/zqywsrc/lib/libsbsapi.a -L/usr/users/informix/lib/esql -L/usr/users/informix/lib -lc -lm -ll -lwsc -lbuft -lwsc -lnws -lnwi -lnws -lfml -lfml32 -lgp
make: 1254-004 The error code from the last command is 8.
 

推荐阅读
  • 本文讨论了clone的fork与pthread_create创建线程的不同之处。进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合。在调用系统调用fork创建一个进程时,子进程只是完全复制父进程的资源,这样得到的子进程独立于父进程,具有良好的并发性。但是二者之间的通讯需要通过专门的通讯机制,另外通过fork创建子进程系统开销很大。因此,在某些情况下,使用clone或pthread_create创建线程可能更加高效。 ... [详细]
  • 本文详细介绍了Linux中进程控制块PCBtask_struct结构体的结构和作用,包括进程状态、进程号、待处理信号、进程地址空间、调度标志、锁深度、基本时间片、调度策略以及内存管理信息等方面的内容。阅读本文可以更加深入地了解Linux进程管理的原理和机制。 ... [详细]
  • CentOS 6.5安装VMware Tools及共享文件夹显示问题解决方法
    本文介绍了在CentOS 6.5上安装VMware Tools及解决共享文件夹显示问题的方法。包括清空CD/DVD使用的ISO镜像文件、创建挂载目录、改变光驱设备的读写权限等步骤。最后给出了拷贝解压VMware Tools的操作。 ... [详细]
  • 本文介绍了一个误删Oracle数据文件导致数据库无法打开的问题,并提供了解决方式。解决方式包括切换到mount状态、离线删除报错的数据文件等。 ... [详细]
  • 本文介绍了一种轻巧方便的工具——集算器,通过使用集算器可以将文本日志变成结构化数据,然后可以使用SQL式查询。集算器利用集算语言的优点,将日志内容结构化为数据表结构,SPL支持直接对结构化的文件进行SQL查询,不再需要安装配置第三方数据库软件。本文还详细介绍了具体的实施过程。 ... [详细]
  • 本文介绍了使用数据库管理员用户执行onstat -l命令来监控GBase8s数据库的物理日志和逻辑日志的使用情况,并强调了对已使用的逻辑日志是否及时备份的重要性。同时提供了监控方法和注意事项。 ... [详细]
  • 微软评估和规划(MAP)的工具包介绍及应用实验手册
    本文介绍了微软评估和规划(MAP)的工具包,该工具包是一个无代理工具,旨在简化和精简通过网络范围内的自动发现和评估IT基础设施在多个方案规划进程。工具包支持库存和使用用于SQL Server和Windows Server迁移评估,以及评估服务器的信息最广泛使用微软的技术。此外,工具包还提供了服务器虚拟化方案,以帮助识别未被充分利用的资源和硬件需要成功巩固服务器使用微软的Hyper - V技术规格。 ... [详细]
  • 关于我们EMQ是一家全球领先的开源物联网基础设施软件供应商,服务新产业周期的IoT&5G、边缘计算与云计算市场,交付全球领先的开源物联网消息服务器和流处理数据 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • 本文介绍了在Mac上搭建php环境后无法使用localhost连接mysql的问题,并通过将localhost替换为127.0.0.1或本机IP解决了该问题。文章解释了localhost和127.0.0.1的区别,指出了使用socket方式连接导致连接失败的原因。此外,还提供了相关链接供读者深入了解。 ... [详细]
  • 本文讨论了在数据库打开和关闭状态下,重新命名或移动数据文件和日志文件的情况。针对性能和维护原因,需要将数据库文件移动到不同的磁盘上或重新分配到新的磁盘上的情况,以及在操作系统级别移动或重命名数据文件但未在数据库层进行重命名导致报错的情况。通过三个方面进行讨论。 ... [详细]
  • Oracle10g备份导入的方法及注意事项
    本文介绍了使用Oracle10g进行备份导入的方法及相关注意事项,同时还介绍了2019年独角兽企业重金招聘Python工程师的标准。内容包括导出exp命令、删用户、创建数据库、授权等操作,以及导入imp命令的使用。详细介绍了导入时的参数设置,如full、ignore、buffer、commit、feedback等。转载来源于https://my.oschina.net/u/1767754/blog/377593。 ... [详细]
  • 本文介绍了操作系统的定义和功能,包括操作系统的本质、用户界面以及系统调用的分类。同时还介绍了进程和线程的区别,包括进程和线程的定义和作用。 ... [详细]
  • 本文讨论了在VMWARE5.1的虚拟服务器Windows Server 2008R2上安装oracle 10g客户端时出现的问题,并提供了解决方法。错误日志显示了异常访问违例,通过分析日志中的问题帧,找到了解决问题的线索。文章详细介绍了解决方法,帮助读者顺利安装oracle 10g客户端。 ... [详细]
  • Linux下安装免费杀毒软件ClamAV及使用方法
    本文介绍了在Linux系统下安装免费杀毒软件ClamAV的方法,并提供了使用该软件更新病毒库和进行病毒扫描的指令参数。同时还提供了官方安装文档和下载地址。 ... [详细]
author-avatar
jtzhn_146_607
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有