问题描述:
当tuxedo的进程自动增长后,应用会持续报错:
Connection does not exist (err11)
问题分析:
报错信息来源于操作Altibase时。咨询了altibase厂家认为数据库没问题,所以推测是操作altibase的变量失效了所致。
变量代码:
AltibaseIntf * abdb::AltibaseIntf::getInstance()
{
static AltibaseIntf dbi;
return & dbi;
}
static string curTimeStamp("");
由于dbi变量是static,dbi在连接数据库时判断是否连接的变量时间戳也是static,根据我上次的实验证明,static的在linux上替换动态库是会清空内存的,推测tuxedo线程增长的机制与动态库替换相似。(后面经过验证,是第二个static变量导致)
报错代码:
if (SQL_ERROR == SQLAllocStmt(m_dbc, &m_stmt))
{
if (m_dbc == NULL)
LOG_TRACE(logger, "error-altibase m_dbc is null!");
throwError("SQLAllocStmt出错:");
}
SQLAllocStmt函数报错。这个函数报错,很有可能就是m_dbc失去了连接,失去连接的原因很有可能就是dbi变量内存清空了。
整体流程:
void QueryRealBillFromMemDB(CFmlBuf &inBuf, CFmlBuf &outBuf)
{
// 使用单例
DetailbillMgrHolder::getInstance().getRealBillFromMemDB(inBuf,outBuf);
// 调用函数
int DetailbillMgr::getRealBillFromMemDB…
// 取得数据库连接(是static)
abdb::AltibaseIntf * abdbi = abdb::AltibaseIntf::getInstance();
// 如果未连接则进行连接,已连接则直接返回,判断是否连接的变量也为static
abdbi = abdb::connectAltibase(abdbi);
// 这句报错
abdbi->setSql(sql);
}
1 构建环境
先修改tuxedo的ubb文件,比如开发机上的ubb_tp02文件,使得min与max不一致:
tamcbs1l1server SRVGRP="GRPAMCBS1" SRVID=5360 RQADDR="tamcbs1l1" MIN=1 MAX=2 REPLYQ=Y CLOPT="-A -r -e tp02_s
imp -p 1,30:2,30 -- -T"
默认先启动一个进程,然后模拟并发调用,使其自动增长为两个进程。
2 模拟并发调用
调用前只有一个进程:
[builder@crmint-tp02 ~]$
[builder@crmint-tp02 ~]$ps -ef|grep tamcbs1l1server|grep tuxapp|grep 540
tuxapp 60746 1 0 14:31 pts/10 00:00:00 tamcbs1l1server -C dom=ngbss -g 540 -i 5360 -u crmint-tp02 -U /ngbss/tuxapp/log/ulog -m 0 -A -r -e tp02_simp -p 1,30:2,30 -- -T
[builder@crmint-tp02 ~]$
打开2~3个窗口,进程循环调用:
/tuxapp/preloader]$amcbs.sh
调用后几秒钟,自动增长为两个进程,16点30分的就是新的进程:
[builder@crmint-tp02 ~]$
[builder@crmint-tp02 ~]$ps -ef|grep tamcbs1l1server|grep tuxapp|grep 540
tuxapp 60746 1 0 14:31 pts/10 00:00:25 tamcbs1l1server -C dom=ngbss -g 540 -i 5360 -u crmint-tp02 -U /ngbss/tuxapp/log/ulog -m 0 -A -r -e tp02_simp -p 1,30:2,30 -- -T
tuxapp 72538 1 28 16:30 pts/10 00:00:01 tamcbs1l1server -C dom=ngbss -g 540 -i 5361 -u crmint-tp02 -U /ngbss/tuxapp/log/ulog -m 0 -D -A -r -e tp02_simp -p 1,30:2,30 -- -T
[builder@crmint-tp02 ~]$
1,30:2,30的解释:
CLOPT="-A -p 1,30:2,30 -- -T"
为服务器指定命令行参数,这个参数被两个连续减号分成前后 两个 部分
-A:初始化并公告服务进程 中所有的服务
-p:这个参数通常用于MSSQ服务进程,它告诉Tuxedo在什么条件下启动一个新进程,在什么条件下杀死一个新进程。
-p参数可以以队列长度为条件,如”-p 5,6:15,3”,表示在3秒内,如果服务器队列长度超过15则创建一个新的进程实例,在6秒内,如果服务器队列长度小于5,则杀死一个已经存在 的进程实例
-p也可以以服务器负载 为条件,如”-p 500”表示当服务器负载大于500时,就创建一个新的进程 实例,当服务器负载小于500时就杀死一个已经存在 的进程实例
日志也开始报错:
tpcall [task:1][4] QAM_OWEFEE_QUERY@TAM_CBS1_L1SVC return: X_RESULTCODE:-1 X_RESULTINFO:QAM_OWEFEE_QUERY执行异常:
调用函数QueryRealBillFromMemDB发生错误:[INDETERMINATE]AltibaseIntf.cpp:76,17AltibaseException--1: SQLAllocStmt出错:[47175921111094]:,Connection does not exist (err11) X_RECORDNUM:1
lcuName: [task:1] QAM_OWEFEE_QUERY [call ok:4] max:212843ms,min:59105ms,average:0.135758s
一段时间不调用后,进程恢复为1个:(注意,把30改为10会更容易恢复到1个进程)
crmint-tp02:[/ngbss/tuxapp/etc]$
crmint-tp02:[/ngbss/tuxapp/etc]$ps -ef|grep tamcbs1l1server|grep tuxapp|grep 540
tuxapp 77356 1 10 16:54 pts/2 00:00:17 tamcbs1l1server -C dom=ngbss -g 540 -i 5360 -u crmint-tp02 -U /ngbss/tuxapp/log/ulog -m 0 -A -p 1,30:2,10 -- -T
crmint-tp02:[/ngbss/tuxapp/etc]$
3 修改代码
static AltibaseIntf dbi;
static string curTimeStamp("");
把dbi的static去掉,报错依旧。
把curTimeStamp的static去掉,报错去除。
证明是curTimeStamp引起。
经过试验证明,去掉static后,报错不再有。即使tuxedo进程增长了,没有报错;进程降下来了,没有报错;然后进程又再升上去,还是没有报错。
4 错误原因分析
把curTimeStamp和timeStamp打印出来观察
第一次调用时:
curTimeStamp:,timeStamp:2009-02-07 00:00:00
第二次调用时:
curTimeStamp:2009-02-07 00:00:00,timeStamp:2009-02-07 00:00:00
因为cur变量用了static,所以第二次会保持不变,数据库重新连接的条件是cur必须小于time,因此,在这种情况下会沿用原来的dbi连接,但是dbi变量已经可能被清空了,所以报错。
if(curTimeStamp < timeStamp)
{
数据库连接
}
5 另外发现的问题
重新发布libAltibaseIntf.so后,不重启会卡死。
原因待续。
6 解决方案
待续
分享到:
相关推荐
- **文件读写错误**:此类错误多由权限问题引起,检查文件和目录的权限设置,确保TUXEDO进程有足够的权限进行读写操作。 - **配置文件错误**:包括但不限于格式错误、路径错误等。仔细检查配置文件的语法和路径设置...
其核心功能包括事务管理、进程间通信(IPC)以及服务发现等。 二、Tuxedo架构 Tuxedo架构由客户端、服务器端、管理工具和监控工具组成。客户端通过ORB(对象请求代理)与服务器进行通信,服务器端则包含应用程序和...
- **原因分析**:TUXEDO服务数过多或内存泄露。 - **解决步骤**:首先使用`ps aux | head -1; ps aux | grep tuxyy | sort –rnk6`命令检查内存使用情况,若发现服务数过多或内存泄露,及时与华为维护团队沟通,调整...
当Tuxedo服务出现积压情况时,这可能表明系统存在性能瓶颈或者资源争抢,其中数据库问题是一个常见的原因。本篇文章将深入探讨如何在Tuxedo服务积压时排查并解决可能的数据库问题。 首先,我们需要理解Tuxedo服务...
Java 通过 Jolt 调用 Tuxedo 服务是一种常见的技术实践,特别是在集成传统企业级应用时。本文将详细阐述如何在特定环境下(Eclipse3.1, Jolt, WebLogic8.1, Tuxedo9.0)实现这一过程。 首先,Jolt 是 BEA Tuxedo ...
这些配置完成后,WebLogic Server 将能够通过WTC调用Tuxedo服务进行事务处理。在实际操作中,可能还需要考虑其他的配置,如安全设置、性能优化、错误处理和日志记录等。此外,测试和调试是确保配置正确并能正常工作...
以下是使用tuxpa.sh工具进行统计分析后的示例结果: 1. **service每分钟明细统计数据**:显示每个service在每分钟内的调用次数、平均调用时间等信息。 2. **service每分钟汇总统计数据**:提供所有service在每分钟...
为解决上述问题,提出了一种Tuxedo服务资源池化方案,该方案通过建立资源池化技术,实现了对Tuxedo服务的统一分析、管理和整合。具体实现方案包括以下几个关键模块: 1. 配置管理模块:主要负责中间件服务在特定...
在完成服务配置后,需要启动Tuxedo管理服务器`tmserv`以及服务进程。在启动前,确保依赖的数据库服务已经运行,因为Tuxedo服务可能依赖于数据库连接。 4. **配置WebLogic与Tuxedo Jolt**: 在WebLogic服务器中,...
5. **关闭连接**:在完成所有操作后,记得正确关闭与Tuxedo的连接,释放资源。 总的来说,Jolt系列JAR包是Java开发者与Tuxedo系统交互的关键工具,它们使得Java应用能够充分利用Tuxedo的强大功能,如高效的消息传递...
本文通过对Tuxedo的IPC机制进行了深入分析,并结合实际案例提出了优化建议。希望这些内容能帮助读者更好地理解和使用Tuxedo,以应对日益复杂的业务挑战。 #### 参考文献 由于篇幅限制,此处省略具体参考文献。 ###...
Java通过WTC调Tuxedo服务实例,传入类型:String型
3. Client:客户端进程发起服务请求,与Tuxedo服务器进行通信。 4. TUXCONFIG:配置文件,包含了Tuxedo系统的所有配置信息,如服务器定义、网络设置、安全策略等。 三、Tuxedo开发流程 1. 设计服务接口:定义服务...
描述中提到的"tuxedo服务端代码",这部分通常包含了Tuxedo服务的实现,包括定义服务操作、处理客户端请求、管理事务状态等功能。服务端通过定义服务接口(如TMXT定义的接口)来暴露服务,并且能够通过Tuxedo的管理...
2. 服务(Services):Tuxedo中的服务是应用程序逻辑的容器,每个服务可以包含多个进程,负责处理特定类型的事务。 3. 进程(Processes):服务内部的执行单元,处理客户端的请求。 4. 客户端库(Client Libraries)...
UBB(Universal Binary Block)文件是 Tuxedo 的配置文件,它定义了服务、进程、网络监听器等关键组件。配置 UBB 文件涉及设置服务名称、进程类型、监听端口、日志级别等参数,对系统的运行和性能有直接影响。 ### ...
3. **Bundled Services**:Tuxedo8.1包含了一系列的服务,如监控、日志记录、性能分析等,这些服务有助于管理和维护复杂的分布式系统。 4. **TUXCONFIG**:这是Tuxedo的配置工具,用于定义服务器、服务、网络设置等...
3. 调用 Tuxedo 服务的步骤包括准备 Tuxedo 服务端代码、在 Tuxedo 中配置 Jolt 相关文件、启动 Tuxedo 服务、配置 WebLogic 服务与 Tuxedo Jolt 相关的参数、配置 Eclipse 3.1 启动 WebLogic 服务、编写 Eclipse ...