分类:
2009-08-22 13:32:17
在bankapp中,一个服务器提供的所有服务的代码都集成到一个文件中,文件名和服务器名字相同,它们还不是真正的服务器,因为它们不包含main()方法,在buildserver时由系统提供一个。另一种组织Tuxedo系统应用程序的方法是把每个服务代码保存在一个单独的文件中。例如,对于TLR服务器,TLR.EC文件包含三个服务,请可以将它们分成三个文件:INQUIRY.EC、WITHDRAW.EC、DEPOSIT.EC。按如下步骤完成:
⑴.将每个EC文件编译成OBJ文件
⑵.运行buildserver,将它们放到-f开关后面:
buildserver –r TUXEDO/SQL
-s DEOISUT –s WITHDRAW –s INQUIRY
-o TLR
-f DEPOSIT.C –f WITHDRAW.C –f INQUIRY.C
-f util.obj –f lm
这样一来,你就没有必要将所有的服务都写到一个源文件中了,从而增加了灵活性。
⑴.设置环境变量
将samples\atmi\bankapp\nt下的bankvar文件改名为bankvar.bat,复制到父目录,然后对其进行编辑:
@echo off
rem %Tuxedo%为Tuxedo安装目录,APPDIR是bankapp所在的目录
set APPDIR=%TUXDIR%\samples\atmi\bankapp
rem消息所在目录
set NLSPATH=%TUXDIR%\locale\C
rem逻辑块大小,数据库管理员必须设置
set BLKSIZE=512
rem 被缺省使用的数据库名字
set DBNAME=bankdb
rem 指示数据库为共享模式还是私有模式
set DBPRIVATE=no
rem 指示数据库使用的IPC值,必须与ubbconfig中的IPCKEY不同
set DIPCKEY=80953
rem 由tmloadcf使用的环境文件
set ENVFILE=%APPDIR%\ENVFILE
rem 由mc, viewc, tmloadcf使用的字段表文件
set FIELDTBLS=Usysflds,bankflds,creditflds
rem 查找字段表文件的目录
set FLDTBLDIR=%TUXDIR%\udataobj;%APPDIR%
rem 数据库使用的通用设备列表
set FSCONFIG=%APPDIR%\bankdl1
rem MENU中使用的网络地址
set NADDR=
rem 网络设备名
set NDEVICE=
rem MENU脚本中使用的网络监听器地址
set NLSADDR=
rem 事务日志设备,必须和ubbconfig中MACHINES节
rem LMID站点的TLOGDEVICE参数相同
set TLOGDEVICE=%APPDIR%\TLOG
rem 为/T提供全部信息的二进制配置文件
set TUXCONFIG=%APPDIR%\tuxconfig
rem 用户日志文件,必须和ubbconfig中的MACHINES节
rem LMID站点的ULOGPFX参数相同
set ULOGPFX=%APPDIR%\ULOG
rem 由RUNME.sh使用的系统名
set UNAME=
rem 由viewc, tmloadcf使用的view文件列表
set VIEWFILES=aud.vv
set VIEWFILES32=mib_views,tmib_views
rem 查找view文件的目录
set VIEWDIR=%TUXDIR%\udataobj;%APPDIR%
set VIEWDIR32=%TUXDIR%\udataobj;%APPDIR%
rem 指定Q设备
set QMCONFIG=%APPDIR%\qdevice
set PATH=%TUXDIR%\bin;%PATH%
rem 指出Visual C++安装的目录
set MSDEV=G:\Program Files\Microsoft Visual Studio\VC98
set PATH=%PATH%;%MSDEV%\bin
set INCLUDE=%INCLUDE%;%MSDEV%\include;%MSDEV%\mfc\include
set LIB=%LIB%;%MSDEV%\lib;%MSDEV%\mfc\lib
⑵.Build bankapp的应用程序
bankapp的5个服务器:ACCT、BAL、BTADD、TLR、XFER。用一个命令就可以完成编译任务:
G:\Tuxedo\samples\atmi\bankapp\nmake bankapp.nt
若要手工完成编译,首先要将EC文件编译成C文件:
G:\Tuxedo\samples\atmi\bankapp\ESQLC ACCT.EC
生成FML缓冲区头文件:
G:\Tuxedo\samples\atmi\bankapp\mkfldhdr bankflds eventflds
生成目标文件:
G:\Tuxedo\samples\atmi\bankapp\CL /c ACCT.c appinit.c util.c
生成ACCT.exe文件:
buildserver -r TUXEDO/SQL -s OPEN_ACCT -s CLOSE_ACCT
-o ACCT.exe
-f ACCT.obj -f appinit.obj -f util.obj
-r指示哪一个资源管理器的访问库将被编译到acct.exe文件中,本例为TUXEDO/SQL
⑶.编辑bankapp的make文件
在NT平台下,bankapp提供的make文件为bankapp.nt,使用前需要检查一下环境变量TUXDIR、APPDIR的设置。另外一个要注意的地方就是资源管理器参数RM,缺省使用TUXEDO/SQL,因为Tuxedo为bankapp提供数据库服务。如果使用了其它数据库产品,需要把RM参数设置成%TUXDIR%\udataobj\RM文件列表中的某一个值。
⑷.创建bankapp的数据库
bankapp使用了TUXEDO/SQL作为资源管理器,它是一个XA-compliant的资源管理器,XA是事务管理器和资源管理器之间的接口。在单处理机SHM模式和多处理机MP模式下创建数据库的方式是不同的,在SHM模式下,创建步骤如下:
设置环境变量: G:\Tuxedo\samples\atmi\bankapp\bankvar
执行批处理文件:G:\Tuxedo\samples\atmi\bankapp\crbank
crbank.cmd调用crbankdb三次,每次调用前改变一些环境变量,执行完成后,同一台机器上有三个数据文件,这样,就可以在单机上模拟网络环境。在MP模式下创建数据库的步骤如下:
设置环境变量:G:\Tuxedo\samples\atmi\bankapp\bankvar
在一台机器上创建数据库:G:\Tuxedo\samples\atmi\bankapp\crbankdb
在其它机器上,修改bankvar.cmd文件中的数据库通用设备列表FSCONFIG,修改ubbmp配置文件中的相应部分,再进行创建操作。
⑸.准备一个XA-compliant资源管理器
若不使用TUXEDO/SQL作为资源管理器,而使用其它的XA-compliant资源管理器,需要作很多修改:修改bankvar.cmd、修改bankapp服务、修改bankapp.nt文件、修改crbank和crbankdb文件、修改配置文件。
修改bankvar.cmd文件。下面是TUXEDO/SQL资源管理器的配置,已经不能用了,你需要根据实际的数据库系统对这些值进行修改:
BLKSIZE=512
DBNAME=bankdb
DBPRIVATE=no
DIPCKEY=80953
FSCONFIG=${APPDIR}/bankdl1
修改bankapp的服务。bankapp中所有数据库访问都是通过ESQL来完成的,如果你的新资源管理器支持SQL,这就没什么问题。appinit.c中包含了打开和关闭数据库的tpopen()和tpclose()。
修改bankapp.nt。将RM参数修改为新的资源管理器,确保RM文件中有如下入口:
$TUXDIR/udataobj/RM
如果必要,改变SQL编译器和它的选项,源文件的扩展名不一定是EC,你需要指预编译的命令及参数,以ORACLE为例,使用PROC将PC文件预编译成C文件。
修改crbank和crbankdb。注意crbankdb创建的SQL语句在新资源管理器中是否能接受。修改配置文件。在GROUPS节中,为TMSNAME和OPENM指定一个适当的值参数值,这个值要让资源管理器能够识别。
⑹.如何将bankapp和Oralce8进行集成
Oracle8是XA兼容的资源管理器,要实现和bankapp的集成,按如下步骤进行:
①.编辑bankvar.cmd文件,修改如下环境变量的值:
ORACLE_HOME:Oracle8的安装目录
ORACLE_SID:Oracle的系统ID
BLK_SIZE:逻辑块的尺寸
DBNAME:缺省数据库
DBPRIVATE:指示数据库是以共享模式还是私有模式打开(yes/no)
FSCONFIG:数据库使用的通用设置列表
PATH=%PATH%;%ORACLE_HOME%\bin
INCLUDE=%ORACLE_HOME%\rdbms80\xa;
%ORACLE_HOME%\pro80\c\include
PLATFORM=inwnt40
LIB=%TUXDIR%\lib %ORACLE_HOME%\pro80\lib\msvc;
%ORACLE_HOME%\rdbms80\xa;
②.运行bankvar.cmd
③.编辑%TUXDIR%\udataobj\RM文件,追加如下行:
Oracle_XA;xaosw;%ORACLE_HOME%\pro80\lib\msvc\sqllib80.lib
%ORACLE_HOME%\RDBMS80\XA\xa80.lib
如果Oracle服务器在网络的另一端,把那台机器映射到驱动器,如F;
把如下行追加到%TUXDIR%\udataobj\RM文件中:
Oracle_XA;xaosw;f:\orant\pro80\lib\msvc\sqllib80.lib
f:\orant\RDBMS80\XA\xa80.lib
删除RM文件中以前的Oracle_XA入口
④.为Oracle8创建事务管理服务器
cd %APPDIR%
buildtms -r Oracle_XA -o TMS_ORA
⑤.编辑nt\bankapp.mak文件
RM=Oracle_XA
ORACLE_LIB=$(ORACLE_HOME)\PRO80\LIB
RMNAME=Oracle_XA
SQLPUBLIC=$(ORACLE_HOME)\PRO80\C\INCLUDE
ORACLE_DIR=$(ORACLE_HOME)\bin
在.ec.c节中,编辑从EC到C的创建规则,不再使用ESQLC了,而使用PROC:
set TUXDIR=$(TUXDIR) & $(ORACLE_DIR)\proc80
mode=ansi release_cursor=yes
include=$(SQLPUBLIC) include=$(INCDIR)
$(SQL_PLATFORM_INC) -c iname=$*.ec
在.c.obj节中,编辑规则,作出下设置:
$(CC) -c $(CFLAGS) $(SQLPUBLIC) $(INCLUDE) $*.c
⑥.使用Oracle的SQL命令更新EC文件
⑦.将nt\bankapp.mak复制到%APPDIR%下,然后Make一下:
copy nt\bankapp.mak %APPDIR%
nmake –f bankapp.mak
⑧.编辑nt\ubbshm文件:
USER_ID=0
GROUP_ID=0
UNAME_SITE1=执行hostname返回值,用大写形式
TUXDIR=与bankvar.cmd中的相同
APPDIR=与bankvar.cmd中的相同
⑨.在配置文件的GROUPS节中,输入如下改变:
TMSNAME=TMS_ORA
BANKB1 GRPNO=1
OPENINFO="Oracle_XA:Oracle_XA+Acc=P/user1/PaSsWd1+SesTm=0+LogDir=."
[
Oracle_XA + required fields:
Acc=P/oracle_user_id/oracle_password
SesTm=Session_time_limit (maximum time a transaction can be inactive)
optional fields:
LogDir=logdir (where XA library trace file is located)
MaxCur=maximum_#_of_open cursors
SqlNet=connect_string (if Oracle exists over the network)
(eg. SqlNet=hqfin@NEWDB indicates the database with sid=NEWDB accessed at host hqfin by TCP/IP)
]
BANKB2 GRPNO=2
OPENINFO="Oracle_XA:Oracle_XA+Acc=P/user2/PaSsWd2+SesTm=0+LogDir=."
BANKB3 GRPNO=3
OPENINFO="Oracle_XA:Oracle_XA+Acc=P/user3/PaSsWd3+SesTm=0+LogDir=."
⑩.执行其它操作:
创建二进制配置文件:tmloadcf –y nt/ubbshm
在Master机上创建TLOG设备和设备列表:crtlog –m
启动数据库服务器,启动Tuxedo系统:tmboot –y,确保数据库中存在V%XATRANS%视图,如果不存在,以系统用户登录Oracle,然后执行%ORACLE_HOME%\RDBMS80\ADMIN\XAVIEW.SQL,授予使用XA库的Oracle用户Select权限。
在Oracle8中创建bankapp使用的数据库对象。Oracle8安装以后,会创建一个示例数据库,bankapp可以使用这个数据库。编辑crbank-ora8.sql文件,内容如下:
WHENEVER OSERROR EXIT ;
/* 获取system用户的口令 */
PROMPT
PROMPT
PROMPT -- Some of the operations require "system" user privileges
PROMPT -- Please specify the Oracle "system" user password
PROMPT
ACCEPT syspw CHAR PROMPT ’system passwd:’ HIDE ;
CONNECT system/&syspw ;
SHOW user ;
PROMPT
/* 在缺省数据库中为bankapp创建一个新的表空间 */
DROP TABLESPACE bank1
INCLUDING CONTENTS
CASCADE CONSTRAINTS;
PROMPT
PROMPT
PROMPT -- Will create a 3MB tablespace for bankapp ;
PROMPT -------- Please specify full pathname below for Datafile ;
PROMPT -------- Ex: %ORACLE_HOME%/dbs/bankapp.dbf
PROMPT
ACCEPT datafile CHAR PROMPT ’Datafile:’ ;
CREATE TABLESPACE bank1
DATAFILE ’&datafile’ SIZE
DEFAULT STORAGE (INITIAL 10K NEXT 50K
MINEXTENTS 1 MAXEXTENTS 120
PCTINCREASE 5)
ONLINE;
/* 创建一个名叫user1的用户 */
DROP USER user1 CASCADE;
PROMPT Creating user "user1"
CREATE USER user1 IDENTIFIED by PaSsWd1
DEFAULT TABLESPACE bank1
QUOTA UNLIMITED ON bank1 ;
GRANT CREATE SESSION TO user1 ;
GRANT CREATE TABLE TO user1 ;
CONNECT user1/PaSsWd1 ;
SHOW user ;
PROMPT Creating database objects for user "user1" ;
PROMPT Creating table "branch" ;
CREATE TABLE branch (
branch_id NUMBER NOT NULL PRIMARY KEY,
balance NUMBER,
last_acct NUMBER,
last_teller NUMBER,
phoneCHAR(14),
address CHAR(60)
)
STORAGE (INITIAL 5K NEXT 2K
MINEXTENTS 1 MAXEXTENTS 5 PCTINCREASE 5) ;
PROMPT Creating table "account" ;
CREATE TABLE account (
account_id NUMBER NOT NULL PRIMARY KEY,
branch_id NUMBER NOT NULL,
ssn CHAR(12) NOT NULL,
balance NUMBER,
acct_type CHAR,
last_name CHAR(20),
first_name CHAR(20),
mid_init CHAR,
phoneCHAR(14),
address CHAR(60)
)
STORAGE (INITIAL 50K NEXT 25K
MINEXTENTS 1 MAXEXTENTS 50 PCTINCREASE 5) ;
PROMPT Creating table "teller" ;
CREATE TABLE teller (
teller_id NUMBER NOT NULL PRIMARY KEY,
branch_id NUMBER NOT NULL,
balance NUMBER,
last_name CHAR(20),
first_name CHAR(20),
mid_init CHAR
)
STORAGE (INITIAL 5K NEXT 2K
MINEXTENTS 1 MAXEXTENTS 5 PCTINCREASE 5) ;
PROMPT Creating table "history" ;
CREATE TABLE history (
account_id NUMBER NOT NULL,
teller_id NUMBER NOT NULL,
branch_id NUMBER NOT NULL,
amount NUMBER
)
STORAGE (INITIAL 400K NEXT 200K
MINEXTENTS 1 MAXEXTENTS 5 PCTINCREASE 5) ;
在SQL PLUS中执行上面这段SQL语句:
SQL*plus> start $APPDIR/ crbank-ora8.sql
填充数据库:
nt\populate
在Oracle数据库中生成事务
driver
运行bankapp的客户程序:
run
关闭Tuxedo应用程序: