ChinaUnix首页 > 精华文章 > AIX > 正文

[精华] CICS与ORACLE连接问题!


http://www.chinaunix.net 作者:tzg  发表于:2003-12-24 17:45:49
发表评论】 【查看原文】 【AIX讨论区】【关闭

环境:AIX 4.3+CICS 4.2+ORACLE 8.1.5,CICS通过XA和ORACLE建立连接问题:ORACLE session大概10分钟后才能释放,而CICSAS进程则无此问题,BUT WHY?



 prada_gu 回复于:2003-12-17 09:18:38

能不能说说CICS是什么东西,没听说过


 tzg 回复于:2003-12-17 11:46:07

中间件


 angel_xa 回复于:2003-12-17 12:27:36

引用:原帖由 "prada_gu"]能不能说说CICS是什么东西,没听说过
 发表:



IBM公司的一个产品,交易中间件


 fzm 回复于:2003-12-17 14:40:50

对,CICS就是AIX的交易中间件。


 prada_gu 回复于:2003-12-17 15:35:46

晕,IBM的中间件不就是webspare吗,倒没听说过CICS,真是闭塞呀


 chaoping 回复于:2003-12-17 20:28:48

1. Oracle 版本不好。既然8i,为什么不用817。
2。Oraclesession 10分钟才释放是什么意思?详细一点?有无什么Log?怎么识别的,


 tzg 回复于:2003-12-17 21:04:05

1、ORACLE版本是原先安装的,现在没有办法更改了。
2、我们的CICS配置是这样的:一个CICS SERVER端的PROC程序,语音系统(呼叫中心)通过CICS CLIENT端调用   SERVER端PROC程序的函数实现各种功能。
   现在的问题是:基于这种应用的情况下,用户拨打呼叫中心电话进来后通过CICS和ORACLE建立会话,得出需   要的结果。但是当用户挂断电话后,ORACLE的SESSION依然存在,大概10分钟后才能释放。这样当有大量的用    户同时拨打呼叫中心的时候,ORACLE将达到上千个SESSION,服务器资源耗尽。
   #如何才能让ORACLE实时地释放SESSION?
   #如何控制CICS应用服务的运行时间?


 lljj 回复于:2003-12-18 08:46:03

cics启动后,有一个cicsas进程就连入数据库一个,没什么奇怪的阿!
不过是不是你的maxserver设得太大了!在cics的rd里可以改!
如果你的业务没这么大,那有可能是数据库里的某个表被锁了!
然后cics不停的响应新的业务,就堵塞了


 deepblue 回复于:2003-12-18 09:16:48

写了半天全没有了,出现了一个invalid_session。
这个论坛真要命。
那就简单说吧,这个恰恰是中间件的优势。
有一个as就有一个session(oracle7.1.3之前是两个),as的最大数目由RD中Maxserver决定,保留数目由Minserver确定。
就是说交易结束as并不直接宕下来,ServerIdleLimit确定as保留的时间,直到保留数目到Minserve为止。
注意,oracle的初始化参数distributed_transactions应大于Maxserver,道理想必明白,就不多说了。

这个跟lljj说的Maxserver的大小没有关系。


 lljj 回复于:2003-12-18 09:19:23

哦!楼上的兄弟!oracle是这样的吗?
呵呵我只会sybase我以为差不多呢!原来oracle还有这个功能。


 deepblue 回复于:2003-12-18 09:23:54

中间件的其中一个优势就是进程池和连接池。
这个是对的,从数据库角度讲,session和cursor的缓存恰恰可以提高整体的效率。
另外,你说有上千个session是实际的情况,还是你的猜想?
如果这是这种情况,请查一下,你的server程序中是否有CICS RETURN?是否每个交易都没有结束?
如果是这种情况,lljj所说的Maxserver才有一定道理。
请明确,我持怀疑态度。


 deepblue 回复于:2003-12-18 09:29:05

引用:原帖由 "lljj" 发表:
哦!楼上的兄弟!oracle是这样的吗?
呵呵我只会sybase我以为差不多呢!原来oracle还有这个功能。


个人感觉上面的问题应该在CICS层面理解就很清楚了。


 tzg 回复于:2003-12-18 11:03:12

谢谢各位!
ServerIdleLimit是设置空闲的as保留时间,我修改过这个参数值。但对于当前活动的as,这个参数值没有作用。
我们这里的应用一个as可以产生20个以上的SESSION,也就是说一个as有N个交易。as的minserver为1,maxserver为20。
ORACLE的distributed_transactions参数为445,远大于20没问题。
现在要解决的就是如何设置才能让一个as控制一个交易,而不是N个。也就是说一个as最多产生一个SESSION,而不是N个


 tzg 回复于:2003-12-18 11:08:51

因为现在发现,一个as控制着至少25个以上的ORACLE SESSION。但手工把as给KILL掉有,ORACLE SESSION也都随之释放!


 deepblue 回复于:2003-12-18 13:00:23

你能肯定一个as有25个以上的session吗?
用showProcInfo看一下都有那些线程,都是做什么的?
感觉只有dpl本地程序的时候,才用到线程。
请将结果贴出来。
最好将RD和XAD的定义也贴出来看一下。


 deepblue 回复于:2003-12-18 13:01:49

引用:原帖由 "tzg" 发表:
谢谢各位!
ServerIdleLimit是设置空闲的as保留时间,我修改过这个参数值。但对于当前活动的as,这个参数值没有作用。


那是肯定的。可能大家理解有偏差。


 tzg 回复于:2003-12-18 13:10:52

引用:原帖由 "deepblue" 发表:
你能肯定一个as有25个以上的session吗?
用showProcInfo看一下都有那些线程,都是做什么的?
感觉只有dpl本地程序的时候,才用到线程。
请将结果贴出来。
最好将RD和XAD的定义也贴出来看一下。



是的,刚刚查看一个as已经达到了30个ORACLE SESSION


 tzg 回复于:2003-12-18 13:12:33

XAD:

Oracle:
GroupName=""
ActivateOnStartup=yes
ResourceDescription="XA Product Definition"
AmendCounter=13
Permanent=no
SwitchLoadFile="oracle1pc"
XAOpen="Oracle_XA+Acc=P/system@sfhc/s8jiuty"
XAClose=""
XASerialize=all_operations


 deepblue 回复于:2003-12-18 13:14:06

你的xa打开trace了吗?
就是说你的dbgfl=?
看从trace中能否发现什么。
另外把你查看的方法贴出来。


 tzg 回复于:2003-12-18 13:15:28

RD:

:ml7
ResourceDescription="Region Definition"
AmendCounter=16
Modifiable=no
StartType=cold
Groups=
StartupProgList=""
ShutdownProgList1=""
ShutdownProgList2=""
DefaultUserId="CICSUSER"
FileSystemType=SFS
RDBMSInstance=""
FileRSLCheck=external
TransientDataRSLCheck=external
TemporaryStorageRSLCheck=external
JournalRSLCheck=external
ProgramRSLCheck=external
TransactionRSLCheck=external
ESMLoad=no
ESMModule=""
RuntimeProtection=none
LogicalTDQProtection=none
PhysicalTDQProtection=none
NonRecTDQProtection=none
RecTSQProtection=none
NonRecTSQProtection=none
LocalQProtectProtection=none
LocalQProtection=none
ReleaseNum="0420"
LocalSysId="ISC0"
LocalNetworkName=""
CWASize=512
MinServer=1
MaxServer=20
ClassMaxTasks=1,1,1,1,1,1,1,1,1,1
ClassMaxTaskLim=0,0,0,0,0,0,0,0,0,0
ServerIdleLimit=300
SafetyLevel=none
RPCListenerThreads=0
DateForm=ddmmyy
ClassTableSize=5,50,50,1,50,50,50,20,5,50,1,20,5,5
MaxRegionPool=2097152
MaxTaskPrivatePool=1048576
MaxTSHPool=1048576
RegionPoolThreshold=90
TaskShPoolThreshold=90
TaskSHNumBuckets=512
LoadDataNumBuckets=512
SysDump=no
PCDump=yes
ABDump=yes
DumpName="dumps"
CoreDumpName="dir1"
Trace=all
TraceModules=0
ExternalTrace=no
TraceFileA="trace.a"
TraceFileB="trace.b"
TraceFileSize=3276800
SysTraceBufferSize=163840
UserTraceDirectory="/tmp"
PublicUserTraceFile="cicspubl"
IntrospectInterval=10
IntrospectLevel=minimal
ISCDelayMinutes=10
CUBSDelayMinutes=5
CARPDelayHours=8
ProtectPurgeDelayPeriod=8
PurgeDelayPeriod=8
StatsRecord=yes
StatFile="statsfile"
SufficesSupported=yes
CheckpointInterval=1000
DefaultFileServer="/.:/cics/sfs/sfhc2"
RecTSQFile="%Rcicsrectsqfile"
RecTSQIndex="cicsrectsqidx"
RecTSQVol="sfs_%S"
RecTSQPrePages=5
RecTSQMaxRecs=1000000
NonRecTSQFile="%Rcicsnrectsqfil"
NonRecTSQIndex="cicsnrectsqidx"
NonRecTSQVol="sfs_%S"
NonRecTSQPrePages=5
NonRecTSQMaxRecs=1000000
LogicalTDQFile="%Rcicstdqlgfile"
LogicalTDQIndex="cicstdqlgidx"
LogicalTDQVol="sfs_%S"
LogicalTDQPrePages=5
LogicalTDQMaxRecs=1000000
PhysicalTDQFile="%Rcicstdqphfile"
PhysicalTDQIndex="cicstdqphidx"
PhysicalTDQVol="sfs_%S"
PhysicalTDQPrePages=5
PhysicalTDQMaxRecs=1000000
NonRecTDQFile="%Rcicstdqnofile"
NonRecTDQIndex="cicstdqnoidx"
NonRecTDQVol="sfs_%S"
NonRecTDQPrePages=5
NonRecTDQMaxRecs=1000000
LocalQProtectFile="%Rcicsplqfile"
LocalQProtectIndex="cicsplqidx"
AutoDCELogin=no
LocalQProtectVol="sfs_%S"
LocalQProtectPrePages=5
LocalQProtectMaxRecs=1000000
LocalQFile="%Rcicsnlqfile"
LocalQIndex="cicsnlqidx"
LocalQVol="sfs_%S"
LocalQPrePages=5
LocalQMaxRecs=1000000
TSQAgeLimit=20
ProgramCacheSize=0
LocalLUName=""
ServerSideTran=no
AuthenticationService=CICS
NameService=NONE
AllowDebugging=no
ECIPasswordCacheSeconds=28800
HTMLBrowser=""
AutoinstallMode=default
MaxConsoleSize=0
MaxTaskCPU=0
MaxTaskCPUAction=warning
TransDumpTrace=no


 deepblue 回复于:2003-12-18 13:23:55

select a.program,b.spid from v$session a,v$process b where a.paddr=b.addr
确认spid的进程号是同一个as的进程号吗?


 deepblue 回复于:2003-12-18 13:25:14

感觉不出定义有何不对。
但需要详查一下。


 deepblue 回复于:2003-12-18 13:30:13

将下面的结果贴上来:
1、select a.program,b.spid from v$session a,v$process b where a.paddr=b.addr 
确认spid的进程号是同一个as的进程号吗? 
2、ps -ef|grep as
3、showProcInfo as_process_no>;/tmp/threadinfo.txt


 deepblue 回复于:2003-12-18 13:32:41

另外发生这种情况时,交易是否已经正常返回。
实在觉得有问题可以用CEDF跟踪一下。
也可以通过CEMT和CSTD查看一下交易的情况。


 deepblue 回复于:2003-12-18 13:34:02

要把情况说清楚,实在不行,俺可以找一找IBM。


 tzg 回复于:2003-12-18 13:39:14

引用:原帖由 "deepblue" 发表:
select a.program,b.spid from v$session a,v$process b where a.paddr=b.addr
确认spid的进程号是同一个as的进程号吗?



不是的,因为一个as对应N个SESSION,所以不可能as的进程号和SESSION的spid进程号一样啊!


 tzg 回复于:2003-12-18 13:43:01

引用:原帖由 "deepblue" 发表:
另外发生这种情况时,交易是否已经正常返回。
实在觉得有问题可以用CEDF跟踪一下。
也可以通过CEMT和CSTD查看一下交易的情况。



交易已经正常返回!

CEMT和CSTD不是很会用,能否指导一下。

另外我们没有定义交易,用的是系统默认的!


 tzg 回复于:2003-12-18 13:52:05

引用:原帖由 "deepblue" 发表:
将下面的结果贴上来:
1、select a.program,b.spid from v$session a,v$process b where a.paddr=b.addr 
确认spid的进程号是同一个as的进程号吗? 
2、ps -ef|grep as
3、showProcInfo as_process_no>;/tmp/t..........



1、
 PROGRAM  SPID
cicsas@sfhc2 (TNS V1-V3) 29508
cicsas@sfhc2 (TNS V1-V3) 46264
cicsas@sfhc2 (TNS V1-V3) 16638
cicsas@sfhc2 (TNS V1-V3) 46820
cicsas@sfhc2 (TNS V1-V3) 27498
cicsas@sfhc2 (TNS V1-V3) 42870
cicsas@sfhc2 (TNS V1-V3) 35162
cicsas@sfhc2 (TNS V1-V3) 29838
cicsas@sfhc2 (TNS V1-V3) 40548
cicsas@sfhc2 (TNS V1-V3) 47490
cicsas@sfhc2 (TNS V1-V3) 15834
cicsas@sfhc2 (TNS V1-V3) 42122
cicsas@sfhc2 (TNS V1-V3) 46572
cicsas@sfhc2 (TNS V1-V3) 30832

2、
    cics 25782 41664   0 13:40:47      -  0:02 cicsas cicssfhc 1441813 104 a0000000 b0000000


 deepblue 回复于:2003-12-18 13:52:52

引用:原帖由 "tzg" 发表:


不是的,因为一个as对应N个SESSION,所以不可能as的进程号和SESSION的spid进程号一样啊!


刚才没有写清楚,spid是cicsas的子进程--与oracle打交道的shadow进程的进程号。
执行出来的结果是子进程号,父进程号就很好找了。
将前两步执行一下,贴出来。
是不是一个as对应多个SESSSION,这个语句一执行就知道了。


 deepblue 回复于:2003-12-18 13:55:13

看spid的父进程是不是25782即可。


 deepblue 回复于:2003-12-18 13:56:48

CEMT和CSTD的用法看一下随机文档。
交易可以不用定义,不用定义是默认是CPMI交易。


 tzg 回复于:2003-12-18 13:58:07

3、
 $t1     wait      0xe60217bc blocked   137095     k   no   sys  _pthread_ksleep

 $t2     wait      0xe6018fbc blocked   102269     k   no   sys  _pthread_ksleep

 $t3     wait      0x32db04b4 running   153031     k   no   sys  _ptrgl

>;$t4     run                  blocked   122201     k   no   sys  _pthread_ksleep

 $t5     wait      0xe60268bc blocked   157719     k   no   sys  _pthread_ksleep

 $t6     wait      0xe60190bc blocked   102579     k   no   sys  _pthread_ksleep

 $t7     wait      0xe6026abc blocked   158411     k   no   sys  _pthread_ksleep

 $t8     wait                 running   140943     k   no   sys  lthread_loop

 $t9     wait      0xe60206bc blocked   132639     k   no   sys  _pthread_ksleep

 $t10    wait      0xe60272bc blocked   160331     k   no   sys  _pthread_ksleep

 $t11    wait      0xe6025abc blocked   154139     k   no   sys  _pthread_ksleep

 $t12    wait      0xe600dabc blocked    55909     k   no   sys  _pthread_ksleep

 $t13    wait      0xe60215bc blocked   136471     k   no   sys  _pthread_ksleep

 $t14    wait      0xe60123bc blocked    74597     k   no   sys  _pthread_ksleep

=== Thread 1 ===

evt._pthread_ksleep(0x2023c9e0, 0x0, 0xffffffff, 0x0, 0xffffffff) at 0xd0105c98
evt._pthread_event_wait(??) at 0xd0106190
evt._pthread_event_wait(??) at 0xd0106190
cond._cond_wait_local(??, ??, ??) at 0xd0102004
cond._cond_wait(??, ??, ??) at 0xd01025ac
cond.pthread_cond_timedwait(??, ??, ??) at 0xd0102f80
dce_pthread_cond_timedwait(??, ??, ??) at 0xd06bcac8
bde_CondTimedWait(??, ??, ??) at 0xd15bde80
SupPR_DoCondTimedWait(??, ??, ??, ??, ??) at 0xd1c3ecd4
SupPR_CondTimedWait(??, ??, ??) at 0xd1c3e93c
ConTS_GetASWork(??, ??, ??, ??, ??, ??, ??, ??) at 0xd1eb2184
main(??, ??) at 0x10000db0

=== Thread 2 ===

evt._pthread_ksleep(0x2ff220f0, 0x0, 0x0, 0x0, 0x2023c9e0) at 0xd0105c98
evt._pthread_event_wait(??) at 0xd0106190
evt._pthread_event_wait(??) at 0xd0106190
cond._cond_wait_local(??, ??, ??) at 0xd0102004
cond._cond_wait(??, ??, ??) at 0xd01025ac
cond.pthread_cond_timedwait(??, ??, ??) at 0xd0102f80
dce_ptdexc_cond_timedwait(??, ??, ??) at 0xd06bec54
timer_loop() at 0xd08e5714
pthread._pthread_body(??) at 0xd00fc230

=== Thread 3 ===

ptrgl._ptrgl() at 0xd159dbc4
BaseStartFunc(??) at 0xd159ab84
BaseStartFunc(??) at 0xd159ab84
pthread._pthread_body(??) at 0xd00fc230

=== Thread 4 ===

evt._pthread_ksleep(??, ??, ??, ??, ??) at 0xd0105d34
signal.sigwait(??, ??) at 0xd0109230
dce_sigwait(??) at 0xd06bf79c
libdcelibc_r.sigwait(??) at 0xd0168738
bde_WaitForSignal(??, ??, ??) at 0xd15a27b4
TasTA_SRT(??) at 0xd1e77ae4
BaseStartFunc(??) at 0xd159ab84
pthread._pthread_body(??) at 0xd00fc230
=== Thread 5 ===

evt._pthread_ksleep(0x2023c9e0, 0x0, 0xffffffff, 0x0, 0xffffffff) at 0xd0105c98
evt._pthread_event_wait(??) at 0xd0106190
evt._pthread_event_wait(??) at 0xd0106190
cond._cond_wait_local(??, ??, ??) at 0xd0102130
cond._cond_wait(??, ??, ??) at 0xd01025ac
cond.pthread_cond_wait(??, ??) at 0xd010321c
dce_pthread_cond_wait(??, ??) at 0xd06bca54
MessageHandlingThread(??) at 0xd170bc90
BaseStartFunc(??) at 0xd159ab84
pthread._pthread_body(??) at 0xd00fc230

=== Thread 6 ===

evt._pthread_ksleep(0x202845d0, 0x0, 0x0, 0x0, 0x2023c9e0) at 0xd0105c98
evt._pthread_event_wait(??) at 0xd0106190
evt._pthread_event_wait(??) at 0xd0106190
cond._cond_wait_local(??, ??, ??) at 0xd0102004
cond._cond_wait(??, ??, ??) at 0xd01025ac
cond.pthread_cond_timedwait(??, ??, ??) at 0xd0102f80
dce_pthread_cond_timedwait(??, ??, ??) at 0xd06bcac8
bde_ThreadSleep(??) at 0xd159cf9c
CacheThread(??) at 0xd1b3ab84
BaseStartFunc(??) at 0xd159ab84
pthread._pthread_body(??) at 0xd00fc230

=== Thread 7 ===

evt._pthread_ksleep(0x202a16d0, 0x0, 0x0, 0x0, 0x202845d0) at 0xd0105c98
evt._pthread_event_wait(??) at 0xd0106190
evt._pthread_event_wait(??) at 0xd0106190
cond._cond_wait_local(??, ??, ??) at 0xd0102130
cond._cond_wait(??, ??, ??) at 0xd01025ac
cond.pthread_cond_wait(??, ??) at 0xd010321c
dce_ptdexc_cond_wait(??, ??) at 0xd06bebdc
rpc_server_listen(??, ??) at 0xd08d6c44
trdce_ServerListen(??, ??) at 0xd16e1c78
ClientListen(??) at 0xd1726010
BaseStartFunc(??) at 0xd159ab84
pthread._pthread_body(??) at 0xd00fc230
=== Thread 8 ===

lthread_loop() at 0xd09c9dfc
lthread(??) at 0xd09ca270
lthread(??) at 0xd09ca270
pthread._pthread_body(??) at 0xd00fc230

=== Thread 9 ===

evt._pthread_ksleep(0x203b57e0, 0x0, 0x0, 0x0, 0x20396330) at 0xd0105c98
evt._pthread_event_wait(??) at 0xd0106190
evt._pthread_event_wait(??) at 0xd0106190
cond._cond_wait_local(??, ??, ??) at 0xd0102130
cond._cond_wait(??, ??, ??) at 0xd01025ac
cond.pthread_cond_wait(??, ??) at 0xd010321c
dce_ptdexc_cond_wait(??, ??) at 0xd06bebdc
cthread_call_executor(??) at 0xd08e7dac
pthread._pthread_body(??) at 0xd00fc230

=== Thread 10 ===

evt._pthread_ksleep(0x203d4ae0, 0x0, 0x0, 0x0, 0x203b57e0) at 0xd0105c98
evt._pthread_event_wait(??) at 0xd0106190
evt._pthread_event_wait(??) at 0xd0106190
cond._cond_wait_local(??, ??, ??) at 0xd0102130
cond._cond_wait(??, ??, ??) at 0xd01025ac
cond.pthread_cond_wait(??, ??) at 0xd010321c
dce_ptdexc_cond_wait(??, ??) at 0xd06bebdc
cthread_call_executor(??) at 0xd08e7dac
pthread._pthread_body(??) at 0xd00fc230

=== Thread 11 ===

evt._pthread_ksleep(0x203f2b20, 0x0, 0x0, 0x0, 0x203d4ae0) at 0xd0105c98
evt._pthread_event_wait(??) at 0xd0106190
evt._pthread_event_wait(??) at 0xd0106190
cond._cond_wait_local(??, ??, ??) at 0xd0102130
cond._cond_wait(??, ??, ??) at 0xd01025ac
cond.pthread_cond_wait(??, ??) at 0xd010321c
dce_ptdexc_cond_wait(??, ??) at 0xd06bebdc
cthread_call_executor(??) at 0xd08e7dac
pthread._pthread_body(??) at 0xd00fc230

=== Thread 12 ===

evt._pthread_ksleep(0x20412f00, 0x0, 0x0, 0x0, 0x203f2b20) at 0xd0105c98
evt._pthread_event_wait(??) at 0xd0106190
evt._pthread_event_wait(??) at 0xd0106190
cond._cond_wait_local(??, ??, ??) at 0xd0102130
cond._cond_wait(??, ??, ??) at 0xd01025ac
cond.pthread_cond_wait(??, ??) at 0xd010321c
dce_ptdexc_cond_wait(??, ??) at 0xd06bebdc
cthread_call_executor(??) at 0xd08e7dac
pthread._pthread_body(??) at 0xd00fc230

=== Thread 13 ===

evt._pthread_ksleep(0x20432110, 0x0, 0x0, 0x0, 0x20412f00) at 0xd0105c98
evt._pthread_event_wait(??) at 0xd0106190
evt._pthread_event_wait(??) at 0xd0106190
cond._cond_wait_local(??, ??, ??) at 0xd0102130
cond._cond_wait(??, ??, ??) at 0xd01025ac
cond.pthread_cond_wait(??, ??) at 0xd010321c
dce_ptdexc_cond_wait(??, ??) at 0xd06bebdc
cthread_call_executor(??) at 0xd08e7dac
pthread._pthread_body(??) at 0xd00fc230

=== Thread 14 ===

evt._pthread_ksleep(0x20451320, 0x0, 0x0, 0x0, 0x20432110) at 0xd0105c98
evt._pthread_event_wait(??) at 0xd0106190
evt._pthread_event_wait(??) at 0xd0106190
cond._cond_wait_local(??, ??, ??) at 0xd0102130
cond._cond_wait(??, ??, ??) at 0xd01025ac
cond.pthread_cond_wait(??, ??) at 0xd010321c
dce_ptdexc_cond_wait(??, ??) at 0xd06bebdc
cthread_call_executor(??) at 0xd08e7dac
pthread._pthread_body(??) at 0xd00fc230


 tzg 回复于:2003-12-18 14:04:54

引用:原帖由 "deepblue"]看spid的父进程是不是25782即可。
 发表:



是说ORACLE SESSION的SPID吗?如何查呢?


 deepblue 回复于:2003-12-18 17:29:10

举个例子吧:
SQL>; select a.program,b.spid from v$session a,v$process b where a.paddr=b.addr
  2  /

PROGRAM                                          SPID
------------------------------------------------ ---------
oracle@Csps (PMON)                               27340
oracle@Csps (DBW0)                               26610
oracle@Csps (LGWR)                               22098
oracle@Csps (CKPT)                               45736
oracle@Csps (SMON)                               44566
oracle@Csps (RECO)                               31574
cicsas@Csps (TNS V1-V3)                          48378
cicsas@Csps (TNS V1-V3)                          35738
cicsas@Csps (TNS V1-V3)                          46484
cso_MoniServerV3@Csps (TNS V1-V3)                51528
csps30.exe                                       46192

PROGRAM                                          SPID
------------------------------------------------ ---------
sqlplus@Csps (TNS V1-V3)                         47812

12 rows selected.

看一下cicsas有关的进程号有三个,找一个吧,如46484
$ ps -ef|grep 46484
    cics 46484 44976   0   Dec 17      -  0:00 oracleora817 (DESCRIPTION=(LOCAL=YES)(ADDRESS=(PROTOCOL=beq)))
    root 47816 62648   1 16:12:16  pts/9  0:00 grep 46484

$ ps -ef|grep cicsas
    cics 25956 60128   0 00:00:00      -  0:02 cicsas CICSCSPS 1966108 108 a0000
000 b0000000
    root 41212 62648   1 16:10:54  pts/9  0:00 grep cicsas
    cics 44976 55840   0   Dec 17      -  0:00 cicsas DEEPBLUE 4194330 102 a0000
000 b0000000

可以看一下44976恰恰是cicsas的进程号。
    cics 51808 55840   0   Dec 17      -  0:15 cicsas DEEPBLUE 4194330 101 a0000
000 b0000000

其他两个也可以通过这种方式验证。这样才能确定是一个as有多个session,否则你用什么一句说呢?
我能想到的,一个as中有多次link 其他PD的情况,才有可能有多个应用的线程。
但session应该是基于进程,而不是线程的。所以,你说的情况,我还是想不清楚。
我怀疑一个as对应多个session.


 deepblue 回复于:2003-12-18 17:32:39

引用:原帖由 "deepblue" 发表:
可以看一下44976恰恰是cicsas的进程号。 
cics 51808 55840 0 Dec 17 - 0:15 cicsas DEEPBLUE 4194330 101 a0000 
000 b0000000 


不好意思,我是从屏幕上粘过来的,其中,“cics 51808 55840 0 Dec 17 - 0:15 cicsas DEEPBLUE 4194330 101 a0000 
000 b0000000”
应该在“可以看一下44976恰恰是cicsas的进程号。”前面。


 tzg 回复于:2003-12-18 19:20:23

我查看了一下,我的所有ORACLE的SPID的父进程都是1
  oracle 124154      1   0 18:58:51      -  0:00 oraclesfhc (LOCAL=NO)
  oracle 124368      1   0 18:58:21      -  0:00 oraclesfhc (LOCAL=NO)

然后ps -ef|grep cicsas
    cics  20552  41664   9 18:48:01      -  0:14 cicsas cicssfhc 1441813 106 a00
00000 b0000000
根本就对不上号

另外as就是对应多个session啊。只要把as进程KILL掉,ORACLE SESSION就相应地释放了!


 tzg 回复于:2003-12-18 19:30:39

更夸张的是在高峰期,一个as竟然对应了104个ORACLE SESSION。但我把这个as KILL掉后,SESSION就全都释放了。
太难懂了!
因为我们是在一个程序中分为多个函数以实现不同的功能,实际上和一个as link多个PD差不多,不知道会不会是这个受影响的。
另外我又该如何控制一个as所对应的SESSION(交易)呢?


 tzg 回复于:2003-12-18 19:33:46

还有想问一下,如果手工KILL掉as的话,会不会有什么负面的影响(对CICS其他方面而言),以为CICS文档中建议是不手工KILL as


 yanbing 回复于:2003-12-19 02:29:13

cics我不是很懂,可惜帮不上忙!

谢谢deepblue和各位兄弟的热情,如果可以的话,请指教!

有各位的热心帮助才是CU最大的财富!!!!!


 deepblue 回复于:2003-12-19 04:39:54

根据你说的情况,你的oracle是否用的MTS,而不是dedicated server?
如果是MTS方式,情形才和所说的类似,请确认。
另外,一般建议不要采用MTS方式。


 tzg 回复于:2003-12-19 07:56:01

引用:原帖由 "deepblue" 发表:
根据你说的情况,你的oracle是否用的MTS,而不是dedicated server?
如果是MTS方式,情形才和所说的类似,请确认。
另外,一般建议不要采用MTS方式。




oracle用的是dedicated server


 deepblue 回复于:2003-12-19 08:45:18

[quote="tzg"]我查看了一下,我的所有ORACLE的SPID的父进程都是1
  oracle 124154      1   0 18:58:51      -  0:00 oraclesfhc (LOCAL=NO)
  oracle 124368      1   0 18:58:21      -  0:00 oraclesfhc (LOCAL=NO)

然后p..........

我觉得很难理解。
只有oracle本身的server进程的父进程的进程号为1。其他shadow进程的父进程应该是proc程序进程的进程号。v$process中的spid就是shadow进程的进程号。
既然是dedicated server,因此,根据我说的例子肯定可以验证的。
不知道我说清楚了没有。
另外,如果方便,你能否把你的程序也贴出来看一下,不过我感觉你说的情况真的不可理解。


 deepblue 回复于:2003-12-19 08:46:49

引用:原帖由 "tzg" 发表:
更夸张的是在高峰期,一个as竟然对应了104个ORACLE SESSION。但我把这个as KILL掉后,SESSION就全都释放了。
太难懂了!
因为我们是在一个程序中分为多个函数以实现不同的功能,实际上和一个as link多个PD差不多,..........


一个程序中的多个函数如何跟一个as link多个PD差不多?


 tzg 回复于:2003-12-19 09:28:06

我们的程序太大了,不好贴。
实际上我们的主程序是在CICS SERVER端直接用PROC和数据库相连接的。
我所说的一个程序中的多个函数是这样的,举个例子
我的CICS SERVER端的PROC主程序是这样的
int a……
int b……
……
定义了多个函数。
然后在CICS CLIENT端生成DLL文件,再由语音平台的程序通过调用DLL,通过CICS传递数据来完成交易
例如我呼入一个电话,要实现某项功能。可能就调用到了a,b这两个函数。
这样的话不是和一个as link多个PD差不多吗?
大概的意思就是这样。
谢谢!!!


 deepblue 回复于:2003-12-19 10:41:07

你用1pc还是no_xa?
我看你的switchloadfile用的是1pc的,我只是想确认一下。


 tzg 回复于:2003-12-19 10:43:35

1pc


 tzg 回复于:2003-12-19 10:49:07

另外我看了以下PROGRAM定义,user exit number定义的是0代表什么意思?
如果是一个交易调用一个PROGRAM对应一个as的话,那它交易完成后也应该有一个返回值,这样的话CICS才知道交易已经完成而terminate掉as,不知道这一步是如何实现的?
另外,因为我现在设的minserver为,也就是说当前活动的as应该是为1。但目前的情况不是这样的。由于业务的增加,又产生了2个as,而原先active的as在serveridletime值之后(5min)后却没有terminate,不知道这又是何故,我监控了一下,最长时间的as持续了大概有40分钟以上!


 deepblue 回复于:2003-12-19 11:01:21

引用:原帖由 "tzg" 发表:
我们的程序太大了,不好贴。
实际上我们的主程序是在CICS SERVER端直接用PROC和数据库相连接的。
我所说的一个程序中的多个函数是这样的,举个例子
我的CICS SERVER端的PROC主程序是这样的
int a……
int b……..........


那对于前端而言,1个函数就ECI_CALL1次吗?
但一次CALL结束后才能进行下一词CALL呀。
你一直没有提供直接的证据征证明一个as对应多个session,除了用Kill as的方法。我建议你用我提供的例子,查看一下。
我觉得这个帖子确实也够长的了。:)
因此有几个建议:
1、将oracle815升为oracle8174。
2、仔细检查程序逻辑。
3、按照我曾经提供的例子认真查一下,虽然不能解决问题,或许可以提供一下素材。
一个进程如何能对应多个数据库的session?个人感觉象这么讨论下去可能很难找到原因。
也请其他高手指点。


 tzg 回复于:2003-12-19 11:20:39

一个交易,1个函数就是ECI_CALL 1次。
但是在其中一个交易的过程中可能会有另外一个交易也有可能同时CALL这个函数啊!
我所说的一个as对应多个SESSION意思就是一个as对应多个交易,因而多个交易对应了多个session
前面我已经用你的例子查看了啊,就是前面贴出来的结果!

谢谢!


 tzg 回复于:2003-12-19 11:23:07

deepblue老大可否给我一份银行或者其他具体应用的例子(配置、安装)等以供参考?谢谢!!!


 tzg 回复于:2003-12-19 11:42:50

mail为:tongzuogang@hnhzfw.com
再次感谢deepblue


 angel_xa 回复于:2003-12-19 14:01:07

通过CICS连接到ORACLE的进程的父进程号不可能是1的,并且一个AS进程是只对应ORACLE的一个SESSION的,就是说当提交了一个交易的时候,由CICS分配一个AS进行处理,然后通过一个SESSION连接到数据库进行处理,如果该交易正确执行后,那么刚才的那个SESSION会释放,但是AS不一定会掉的(这点前面已经说过了),然后该AS又可以去处理其他交易了。所以是不可能有一个AS进程对应几个SESSION的情况的(在DEDICATED模式下)。
前面说的,KILL AS进程是有风险的,有时会导致REGION宕掉。


 angel_xa 回复于:2003-12-19 14:08:46

另外,虽然一个AS在处理完一个交易后处理另外的交易,但是其与ORACLE的连接的SESSION NUMBER --sid号是不变的(在该AS进程不掉的情况下,只有在重新产生AS进程才会对应不同的SESSION号的),但是可以查出其中执行的SQL语句已经不同了。一个AS是只对应一个SESSION的。我的系统里就是这样的。


 tzg 回复于:2003-12-19 14:13:32

不是说通过CICS连接到ORACLE,而是CICS负责数据的传递。连接ORACLE是CICS SERVER端的PROC函数直接和ORACLE连接的。
正常情况下交易结束后是AS会释放SESSION,但现在确实是没有释放。
但是AS仍然可以处理别的交易!


 tzg 回复于:2003-12-19 14:20:09

引用:原帖由 "angel_xa"]另外,虽然一个AS在处理完一个交易后处理另外的交易,但是其与ORACLE的连接的SESSION NUMBER --sid号是不变的(在该AS进程不掉的情况下,只有在重新产生AS进程才会对应不同的SESSION号的),但是可以查出其中执行的S..........
 发表:



看来大家都还没有明白我的意思。
我所讲的AS对应多个SESSION只是指一个AS处理多个交易
我们的应用AS本身是有一个SESSION和数据库相连接(这个肯定是唯一的),但是我们处理事务却是通过CICS SERVER端的程序来实现的,也就是说CICS SERVER端的程序本身又用PROC和数据库直接连接产生SESSION来处理用户的请求!


 angel_xa 回复于:2003-12-19 14:24:15

一个AS不可能同时处理多个交易的,只能在一个交易完成后再处理后面分配的交易。在关于与ORACLE的连接上可能是我标书不准确,我不是搞开发的,是负责系统维护的,在我现在的系统中就是一个AS对应一个SESSION的。


 angel_xa 回复于:2003-12-19 14:31:03

在cicsterm中可以查到当前系统中执行的交易,每个交易对应一个进程号,通过该进程号就可以在ORACLE中查到对应的sid 等信息,以及其执行的SQL语句,虽然可能会执行很多SQL语句,但是这都是处理这一个交易的过程,是程序里写的。这也只能叫一个交易。在这个交易执行完成后,该AS进程(如果不掉的话)会重新执行另外的交易,此时对应的交易码已经不一样了(除非碰巧又是处理和刚才相同的交易)。


 tzg 回复于:2003-12-19 14:33:27

是的,但这些交易可能不是同时进行的啊。就是一个交易完成后立刻就进行下一个交易啊,但是却没有释放上一个交易产生的SESSION。
AS本身是对应一个SESSION,我所说的是交易中由CICS SERVER端的程序产生的SESSION由AS控制,当AS terminate掉后CICS SERVER端程序产生的SESSION也就相应地释放了!


 tzg 回复于:2003-12-19 14:38:18

引用:原帖由 "angel_xa"]在cicsterm中可以查到当前系统中执行的交易,每个交易对应一个进程号,通过该进程号就可以在ORACLE中查到对应的sid 等信息,以及其执行的SQL语句,虽然可能会执行很多SQL语句,但是这都是处理这一个交易的过程,是程..........
 发表:



我们的交易大多都是一样,都是查询某项信息。
另外cicsterm该如何使用,我用cicsterm命令后出现如下提示:
 CCL7054I Server 'CICSSFHC' is currently unavailable
 CCL7026I Press Clear to continue.  The emulator will terminate


 angel_xa 回复于:2003-12-19 14:38:53

AS terminate后 session是要释放的,我的系统就是这样,如果没有释放那就是存在问题。


 tzg 回复于:2003-12-19 14:45:38

引用:原帖由 "angel_xa"]AS terminate后 session是要释放的,我的系统就是这样,如果没有释放那就是存在问题。
 发表:



as terminate后SESSION是会释放。但现在的问题是我的AS并没有实时地terminate,因为处理一个交易结束后它又马上处理另外一个交易,这样就导致了SESSION一直往上增加!


 tzg 回复于:2003-12-19 14:51:43

请教angel_xa老大,cicsterm该怎么用?


 angel_xa 回复于:2003-12-19 14:52:36

那你的AS进程到底terminate没有,如果是AS进程terminate了,那么session肯定是释放的。重新产生的AS进程才会对应一个新的SESSION。

你前面出现的父进程为1的那些ORACLE进程是不正常的,有点类似于僵死进程了,实际是没有进程事务处理的,可以KILL的。


 angel_xa 回复于:2003-12-19 14:53:36

只有ORACLE本身的那几个后台进程的父进程才该是1的。


 tzg 回复于:2003-12-19 15:04:11

AS进程terminate的时间不等,如果是空闲的就在SERVERIDLE时间(5MIN)后就TERMINATE了。但ACTIVE的可能就长了,10分钟、20分钟甚至于50分钟后才TERMINATE
AS terminate后SESSION肯定是释放的了!
很奇怪啊,我的ORALCE数据库所有的ORACLE的父进程都是1,包括我刚刚用SQLPLUS连接上去的SESSION,不知道是什么原因?


 angel_xa 回复于:2003-12-19 15:44:47

引用:原帖由 "tzg"]请教angel_xa老大,cicsterm该怎么用?
 发表:



这个讲起来比较费劲,其中涉及到一些子命令,在现场比较好说一些:
先设置TERM=dtterm
用root执行cicsterm后,选择你使用的REGOIN名后回车进入,
然后就是一些子命令了,如CSTD,CEMT等等,这个你最好查一下相关文档吧,
这样说不太好说明白,在现场比较好说一些。

你的ORACLE的进程父进程都是1呀,这个应该不正常的,你ORACLE是哪个版本,是DEDICATE模式吗?


 angel_xa 回复于:2003-12-19 15:49:48

引用:原帖由 "tzg" 发表:
AS进程terminate的时间不等,如果是空闲的就在SERVERIDLE时间(5MIN)后就TERMINATE了。但ACTIVE的可能就长了,10分钟、20分钟甚至于50分钟后才TERMINATE
AS terminate后SESSION肯定是释放的了!
很奇怪啊,我的OR..........



AS进程的数量是由定义的MAXSERVER和MINSERVER决定的,如果当前交易很多,那就可能打到MAX数量,这时AS进程一般是不会TERMINATE的,到了系统交易不多的时候,有些AS进程就会TERMINATE,但是至少会有MIN数量的AS进程的,这和系统的繁忙程度有关。


 tzg 回复于:2003-12-19 16:44:18

引用:原帖由 "angel_xa" 发表:


这个讲起来比较费劲,其中涉及到一些子命令,在现场比较好说一些:
先设置TERM=dtterm
用root执行cicsterm后,选择你使用的REGOIN名后回车进入,
然后就是一些子命令了,如CSTD,CEMT等等,这个你最好查一下相?.........



oracle版本是8.1.5,是delicated server模式!

设置了还是一样!
 CCL7054I Server 'CICSSFHC' is currently unavailable
 CCL7026I Press Clear to continue.  The emulator will terminate
1B?             CCL7054I CICSSFHC

可能还得在CICS做一些设置!


 deepblue 回复于:2003-12-20 17:59:43

as结束后,oracle的session并不释放,这就是中间件的优势。session的缓存,避免了重复的connect和disconnect。只有as down下来的时候,session才释放。
但一个as应该只对应一个session,oracle7.1.3之前的xa是两个session.
另外,我觉得你一直没有把问题描述清楚。
能否把我给的命令执行以下,把整个屏幕粘贴出来。否则大家都说的驴头不对马嘴。
我觉得根据你说的情况,根本不会这种情况。
噢,想起来了,只有一种情况oracle的shadow进程的父进程(应该是proc程序的进程)可能找不到,就是说父进程异常终止,但shadow进程没有exit,这个时候shadow进程需要PMON进程来进行清理。这个也是PMON的一个职能。
如果说是这种情况,请检查你的proc程序。
建议你升级到oracle8174。


 deepblue 回复于:2003-12-20 18:05:40

引用:原帖由 "deepblue"]as结束后,oracle的session并不释放,这就是中间件的优势。session的缓存,避免了重复的connect和disconnect。只有as down下来的时候,session才释放。
 发表:


sorry,手误,应该说交易结束后,只要as存在,session并不释放。就是说session和交易没有关系,只和as有关。session的缓存,是中间件的优势。


 deepblue 回复于:2003-12-21 12:42:47

引用:原帖由 "deepblue" 发表:
噢,想起来了,只有一种情况oracle的shadow进程的父进程(应该是proc程序的进程)可能找不到,就是说父进程异常终止,但shadow进程没有exit,这个时候shadow进程需要PMON进程来进行清理。这个也是PMON的一个职能。 


想了一下,在这种情况下,你的CICS肯定会出现很多DUMP的。
尝试把你的distributed_transactions和你的MaxServer设的一样大,看有什么错误提示。
另外,建议在你的XAOPEN的串中增加log目录和调试信息级别项,举个例子:
XAOpen="Oracle_XA+Acc=P/aaa/aaa+SesTm=10+LogDir=/tmp/ora817xalog+DbgFl=15"
这样在你的/tmp/ora817xalog目录下就有XA的日志,可以看一下。
反正总想不通你说的情况。
其实CICS和ORALCE也没有什么神秘的,只要你知道工作的原理,肯定能用实际的操作找到确定的问题。
无法登陆你的环境,否则也不至于这么费劲,呵呵。


 tzg 回复于:2003-12-22 09:38:50

引用:原帖由 "deepblue" 发表:

sorry,手误,应该说交易结束后,只要as存在,session并不释放。就是说session和交易没有关系,只和as有关。session的缓存,是中间件的优势。



我所说的SESSION不是AS所对应的SESSION,而是CICS SERVER端的PROC程序和数据库连接所产生的SESSION。
另外我看了AS所对应的SESSION的父进程也是1,真实奇怪了!


 tzg 回复于:2003-12-22 09:44:10

[quote="deepblue"]
无法登陆你的环境,否则也不至于这么费劲,呵呵。
quote]

deepblue老大,能否搞知您的联系方式?


 deepblue 回复于:2003-12-22 17:45:14

引用:原帖由 "tzg" 发表:


我所说的SESSION不是AS所对应的SESSION,而是CICS SERVER端的PROC程序和数据库连接所产生的SESSION。
另外我看了AS所对应的SESSION的父进程也是1,真实奇怪了!


如果你用的是XA,则proc程序中是没有connect动作的,是as和数据库链接,就是说,proc和数据库的连接就是as和数据库的连接。


 angel_xa 回复于:2003-12-22 21:36:06

我的理解和deepblue是相同的。


 tzg 回复于:2003-12-23 08:18:01

引用:原帖由 "deepblue" 发表:

如果你用的是XA,则proc程序中是没有connect动作的,是as和数据库链接,就是说,proc和数据库的连接就是as和数据库的连接。



按这样说的话,那应该就是有多少个CICS的ORACLE SESSION就应该有多少个AS。
但事实并不是这样的。当ORACLE SESSION达到100来个的时候都才只有一个AS,这又该如何解释呢?


 tzg 回复于:2003-12-23 08:18:36

原来PROC程序中是有CONNECT的,后来把它改掉后问题依旧!


 tzg 回复于:2003-12-23 08:34:34

不知道你们的应用里有没有写USER EXIT的程序?
你们那是如何判断一个交易已经完成了的呢?


 deepblue 回复于:2003-12-23 09:21:15

写CICS程序和普通的程序是不同的,比如:用XA的话是不能用connect的,user exit一定不能用exit,而应该用CICS RETURN。
你怎么证明那些SESSION全部是对应于一个AS。我给你提供了方法,但却一直没有拿出证据。
请确认几件事情:
1 XAD的类型不是NO_XA.
2 ORACLE的NET8是DEDICATED SERVER
3 CICS的程序的规范性。CICS程序与普通程序的写法是有很多区别的,请你仔细阅读一下有关的书籍或者手册。
如果满足上述条件,用我提供的方法肯定能找出问题所在的大方向。
另外我让你修改DISTRIBUTED_TRANSACTIONS,然后跟踪XALOG,你是否跟踪?
其实解决问题只能通过这种具体的方法去捕捉,否则指望某个所谓的“高手”来一下子指出问题所在,恐怕比较难。
其实,你要是想大家一起解决这个问题,请按照这个帖子中提到的思路,自己操作以下,把所有的步骤进行屏幕拷贝贴出来,包括执行的命令,屏幕显示的结果(就像我曾经给你贴过的类似),这样也有一个沟通的基础,否则你说你的,我做我的,你说肯定是这样,我说不可能。这样解决问题就比较困难。
以上建议,供参考。你也可以继续按照自己的做法,只要能解决问题就行。


 deepblue 回复于:2003-12-23 09:37:10

就像你曾经贴出来的,我们来分析一下。
1、 
PROGRAM SPID 
cicsas@sfhc2 (TNS V1-V3) 29508 
cicsas@sfhc2 (TNS V1-V3) 46264 
cicsas@sfhc2 (TNS V1-V3) 16638 
cicsas@sfhc2 (TNS V1-V3) 46820 
cicsas@sfhc2 (TNS V1-V3) 27498 
cicsas@sfhc2 (TNS V1-V3) 42870 
cicsas@sfhc2 (TNS V1-V3) 35162 
cicsas@sfhc2 (TNS V1-V3) 29838 
cicsas@sfhc2 (TNS V1-V3) 40548 
cicsas@sfhc2 (TNS V1-V3) 47490 
cicsas@sfhc2 (TNS V1-V3) 15834 
cicsas@sfhc2 (TNS V1-V3) 42122 
cicsas@sfhc2 (TNS V1-V3) 46572 
cicsas@sfhc2 (TNS V1-V3) 30832 

2、 
cics 25782 41664 0 13:40:47 - 0:02 cicsas cicssfhc 1441813 104 a0000000 b0000000

第一条中显示的是ORACLE的SHADOW进程的进程号,如29508等,这些进程的父进程号是否是25782。如果你经过一一核对发现,所有的SHADOW进程的父进程号就是现在存在的你第二条中列出的25782,那就说明这些SESSION的对应的前台进程就是这个CICS AS。
你是否核对?
如果全部对应这个CICS AS,正像你所说,请把你的数据处理的程序框架贴出来。看看为什么这个怪,我认为这种情况应该是不存在的。
或许你会发现这些SESSION对应的SHADOW进程的父进程压根已经不存在了,这个就是我曾经跟你说过的情况,那说明你的程序有问题,或数据库或CICS有BUG。你是否将这些软件的补丁都打上了?我们曾经遇到过,程序补丁未打,造成CICS DUMP的情况。
如果,还觉得有问题,就按照我说的方法察看CICS XA的LOG。
这样一步步的可能思路会清晰一些,而且也逻辑性。就是我们解决不了,找IBM或ORACLE,我们也一个清晰的描述。
我认为解决具体的问题虽然重要,但解决问题的思路和方法应该更重要。
希望我的这些粗浅的想法对你解决这个问题有些帮助。
希望你在解决这个问题后,写一个问题处理报告。我们现在就是这样的。这样对知识也是一种积累和沉淀。


 tzg 回复于:2003-12-23 09:51:41

确认:
1、XAD的类型不是NO_XA
2、ORACLE的NET8是DEDICATED SERVER 
3、CICS程序规范是程序员所编写,没问题


 tzg 回复于:2003-12-23 09:52:11

步骤:
1、select a.program,b.spid from v$session a,v$process b where a.paddr=b.addr and osuser='cics'
        PROGRAM                 SPID
cicsas@sfhc2 (TNS V1-V3) 127066
cicsas@sfhc2 (TNS V1-V3) 32160
cicsas@sfhc2 (TNS V1-V3) 19540
cicsas@sfhc2 (TNS V1-V3) 112270
cicsas@sfhc2 (TNS V1-V3) 64434
cicsas@sfhc2 (TNS V1-V3) 28024
cicsas@sfhc2 (TNS V1-V3) 100458
cicsas@sfhc2 (TNS V1-V3) 42798
cicsas@sfhc2 (TNS V1-V3) 122914

2、ps -ef|grep cicsas
    cics  56448  47166   0 09:30:21      -  0:00 cicsas cicssfhc 50987025 104 a0000000 b0000000

3、ps -ef|grep 127066
  oracle 127066      1   0 09:36:10      -  0:01 oraclesfhc (LOCAL=NO)
   ps -ef|grep 32160
  oracle  32160      1   0 09:36:13      -  0:00 oraclesfhc (LOCAL=NO)
   ps -ef|grep 19540
  oracle  19540      1   0 09:36:15      -  0:00 oraclesfhc (LOCAL=NO)
  其余的几个ORACLE SESSION都一样:所有的父进程都是1


 tzg 回复于:2003-12-23 10:34:27

CICS的版本是4.2,补丁号为9即为4.2.0.9
ORACLE的版本号为8.1.5.0.0

改了XAD的描述为:
XAOpen="Oracle_XA+Acc=P/sfhc@sfhc/insysf1we9+SesTm=10+LogDir=/tmp/xa+DbgFl=15"

但没有改ORACLE的参数DISTRIBUTED_TRANSACTIONS(系统使用中)

可是没有产生XA LOG,真是奇怪!


 deepblue 回复于:2003-12-23 12:07:19

你改完XAD后是否冷启?否则是不起作用的。
另外,现在我才注意到你的shadow进程的父进程为1,是因为你是通过sqlnet来间接数据库的。
能否把你的init.ora和sqlnet.ora tnsnames.ora listener.ora等贴出来。
我觉得和数据库设置有关。


 tzg 回复于:2003-12-23 13:30:42

init.ora

compatible = "8.1.0"

db_name = sfhc
instance_name = sfhc
service_names = sfhc
control_files = ("/soft/oracle/oradata/OraCtl1.ctl","/soft/oracle/oradata/OraCtl2.ctl","/soft/oracle/oradata/OraCtl3.ctl")
db_files = 1000
db_block_size = 8192
db_file_multiblock_read_count =8 #2003/7/16 modify by tjg
db_block_buffers = 204800  
shared_pool_size = 524288000             
shared_pool_reserved_size = 125829120    
processes = 1500
sessions  =1000     
log_buffer = 1048576           
rollback_segments=(r01,r02,r03,r04)
background_dump_dest = /soft/oracle/admin/sfhc/bdump
core_dump_dest = /soft/oracle/admin/sfhc/cdump
user_dump_dest = /soft/oracle/admin/sfhc/udump
remote_login_passwordfile = exclusive
os_authent_prefix = ""
pre_page_sga = yes
optimizer_features_enable = 8.1.5
optimizer_mode = choose
optimizer_percent_parallel = 50
optimizer_index_caching = 30
disk_asynch_io = true
tape_asynch_io = true
large_pool_size = 52428800 #2003/12/08 add by tzg
resource_limit = true
gc_releasable_locks = 89600  #db_block_buffers
enqueue_resources = 6000
open_cursors = 300 
session_cached_cursors = 30 
sort_area_size =  4194304          
sort_area_retained_size = 1048576     
sort_multiblock_read_count = 8
hash_join_enabled = true
hash_area_size    = 16777216 
hash_multiblock_io_count = 8
bitmap_merge_area_size =  4194304   
create_bitmap_area_size = 12582912  
star_transformation_enabled = true
query_rewrite_enabled = true
_push_join_predicate = true
log_checkpoint_interval = 9999999
log_checkpoint_timeout  = 0
log_checkpoints_to_alert = true
log_archive_start = true
log_archive_dest_1 = "location=/oracle_arch reopen=10"
log_archive_format = %t_%s.dbf
nls_language = "simplified chinese"
nls_territory = "china"
nls_date_format = "YYYY-MM-DD"
job_queue_processes=1     
job_queue_interval=60


 tzg 回复于:2003-12-23 13:32:27

listener.ora

# LISTENER.ORA Configuration File:/soft/oracle/product/8.1.5/network/admin/listener.ora
# Generated by Oracle Net8 Assistant

SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (SID_NAME = sfhc) 
      (ORACLE_HOME = /soft/oracle/product/8.1.5)
    ) 
  )

LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS_LIST =
        (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.3.210)(PORT = 1521))

      )
    )
  )


 tzg 回复于:2003-12-23 13:33:18

tnsnames.ora

sfhc=
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.3.210)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SID = sfhc)
    )
  )
was =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.3.9)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SID = was )
    )
  )

sfhc1=
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.3.212)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SID = sfhc)
    )
  )

sfhc2=
  (DESCRIPTION =
    (ADDRESS_LIST =
 (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.3.213)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SID = sfhc)
    )
  )

rman=
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 128.1.1.182)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SID = rman)
    )
  )


 tzg 回复于:2003-12-23 13:35:17

无sqlnet.ora

修改XAD后冷启动了CICS


 deepblue 回复于:2003-12-24 17:45:49

看了一下你提供的脚本也没有什么。
正像上面的分析,通过SQL*NET的listener来连接数据产生的shadow进程的父进程确实是1。因此,也比较难于确定真正对应的as。
我一直不明白,一个as怎么会有多个session。我的理解从理论上应该是不会的。
因此,可以找一下为什么是这样的。为什么会产生那么多的session.有没有其他的region也连到同一个数据库?
可以对数据库加trace。如 用10046事件,打开trace.或者用dbms_system.set_trace_in_session(sid,serial#,true/false),然后看数据库的trace文件。
具体的方法你可以在google上搜索一下,估计能搜出一大堆。如果不清楚,我可以告诉你具体的方法。
另外,可否不要通过listener方式来连接数据库?改为连接本地库试一下,我以前说的方法就可以一目了然地看出来是怎么回事。




原文链接:http://bbs.chinaunix.net/viewthread.php?tid=224219
转载请注明作者名及原文出处