linux :redhat5.5
oracle :oracle10
tuxedo :tuxedo10
================
tuxedo和oracle连接有两种方式:
一种是XA方式,就是由tuxedo来管理控制和oralce的连接和事务,在这种方式下,一般情况,client端首先调用tpbegin函数来发起一个事务,在事务处理过程中,要么调用tpabort失败从而回滚事务。要么成功调用tpcommit提交所处理的事务。
另外一种是非XA方式,这种方式下连接和事务控制管理由开发人员自己写代码控制。一般情况,服务开始首先要调用tpsvrinit函数。完了之后,再调用tpsvrdone函数。这些是控制数据库连接的。当然要完成连接,在ubbconfig配置文件中还要在openinfo中配置数据库连接的信息。在这种方式下,事务控制是程序员实现,当处理的事务程序显式使用exec sql commit;提交,否则exec sql rollback
=================
========================
转:XA连接方法
http://www.cnblogs.com/mopmoq/archive/2009/06/20/1507188.html
TUXEDO 与 ORACLE 数据库的互连(一)
前言
在银行、电信、金融等行业的大型计算机应用系统中,中间件的使用日益普及,中间件已与操作系统、数据库并列为三大基础软件。 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
22222222222222222
TUXEDO与ORACLE数据库的互连(二)
TUXEDO 与 ORACLE 数据库的互连(二)
三、服务端的程序: 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);
}
六、编译客户端程序
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:/te
st> testcli
name=bill
到此,整个配置过程就大功告成了。 ORACLE 的其他版本的配置及在其他操作系统上的配置基本与本文所述差不多,差别主要在 RM 文件中所连的库文件可能会不样。
==============================
============================
==============================
5.2 TUXEDO6.5 连接操作ORACLE8i 的例子,FML32 格
式的
tpsvrinit(int argc, char *argv[])
{
int ret;
EXEC SQL BEGIN DECLARE SECTION;
VARCHAR uid[20];
VARCHAR pwd[20];
/* char db_link_name[20]; */
EXEC SQL END DECLARE SECTION;
argc = argc;
argv = argv;
EXEC SQL WHENEVER SQLERROR DO sqlerr();
strcpy( uid.arr, "test" );
uid.len = strlen( uid.arr );
strcpy( pwd.arr, "test" );
pwd.len=strlen( pwd.arr );
/*
strcpy(dbstring.arr,"testhost");
dbstring.len=strlen(dbstring.arr);
EXEC SQL DECLARE db_link_name DATABASE;
*/
EXEC SQL CONNECT :uid IDENTIFIED BY :pwd ;/*AT db_link_name
using :dbstring;*/
userlog("connect->sqlcode= %d sqlerrmc=%
s/n",sqlca.sqlcode ,sqlca.sqlerrm.sqlerrmc);
if (sqlca.sqlcode == 0)
userlog("server ->tpsvrinit:the EXEC SQL CONNECT
to database success!");
return (0);
}
------------------------------------------------------
5.3 Tuxedo 中不采用XA 连接oracle 数据库的例子
int tpsvrinit(int argc,char** argv)
{
EXEC SQL BEGIN DECLARE SECTION;
VARCHAR username[20];
VARCHAR password[20];
EXEC SQL END DECLARE SECTION;
strcpy(username.arr,"scott");
username.len = strlne(username.arr);
strcpy(password.arr,"tiger");
password.len = strlen(password.arr);
EXEC SQL WHENEVER SQLERROR GOTO sqlerror;
EXEC SQL CONNECT :username IDENTIFIED BY :password /* AT abc
USING :dbstring (if use dblink use it)*/;
sqlerror:
EXEC SQL WHENEVER SQLERROR CONTINUE;
userlog("tpsvrinit connect db sqlcode=[%d] err=[%
s]",sqlca.sqlcode,sqlca.sqlerrm.sqlerrmc);
return(0);
}
void tpsvrdone()
{
EXEC SQL COMMIT WORK RELEASE;
if(sqlca.sqlcode)
userlog( " Close database failed sqlcode=[%d]",sqlca.sqlcode);
else
userlog( "tpsvrdone(): Shutdown server successful!" );
}
================
使用XA方式连接数据,ORACLE与TUXEDO的同一台机器上
RM文件编译正常,UBB文件编译正常,tmboot启动后也连接到ORACLE下(且ORACLE进程多了几个连接)
但,我测试程序执行SQL语句
( EXEC SQL select ename into :ac_ename from EMP where empno=:al_empno;
)
时间,返回错误没有logon
是否在执行EXEC SQL之前需要指定什么数据连接吗?
==================
看是否进入tpsvrinit函数中,如果进入,该函数中是否调用tpopen,如果调用返回结果是否正确,之前检查一下你的rm文件中的连接字符串,还有
tms进程要buildtms正确.
--转自