由于单例和static在内存中的存放位置不一样,而有些应用不管是使用单例还是使用static都是为了共用某个成员,如果混合使用,比如单例里面又使用了static,就会导致某些成员不能保持一致。
最好的解决方案是如果使用了单例,那么单例里成员就不要再使用static,也不要使用static的全局变量。但是如果我设计这个class时还不确定是否使用单例,那可以使用static,只是单例时不使用这个static成员即可。
原有流程:
<!--[if gte mso 9]><xml> <o:OLEObject Type="Embed" ProgID="Visio.Drawing.11" ShapeID="_x0000_i1025" DrawAspect="Content" ObjectID="_1437833746"> </o:OLEObject> </xml><![endif]-->
改造后流程:
<!--[if gte mso 9]><xml> <o:OLEObject Type="Embed" ProgID="Visio.Drawing.11" ShapeID="_x0000_i1026" DrawAspect="Content" ObjectID="_1437833748"> </o:OLEObject> </xml><![endif]-->
DetailbillMgr.h,增加成员变量m_AltibaseIntf
classDetailbillMgr
{
public:
DetailbillMgr()
{
m_AltibaseIntf = NULL;
}
protected:// 改为private
abdb::AltibaseIntf * m_AltibaseIntf;
};
DetailbillMgr.cpp,原来abdbi指向一个static的AltibaseIntf,改为指向DetailbillMgr的成员变量
abdb::AltibaseIntf * abdbi;
if(m_AltibaseIntf==NULL)
{
m_AltibaseIntf = new abdb::AltibaseIntf;
}
m_AltibaseIntf = abdb::connectAltibase(m_AltibaseIntf);
abdbi = m_AltibaseIntf;
改造前:
abdb::AltibaseIntf * abdbi = abdb::AltibaseIntf::getInstance();
abdbi = abdb::connectAltibase(abdbi);
AltibaseIntf.h,AltibaseIntf增加成员变量curTimeStamp,取代原有的static全局变量
classAltibaseIntf {
public:
stringcurTimeStamp;
};
AcctConnection.cpp,把原有的static变量curTimeStamp注释掉,采用新加的成员变量curTimeStamp
//当前时间戳
//static string curTimeStamp("");
if(handle->curTimeStamp < timeStamp)
{
handle->disConnect();
handle->setConnInfo(abdbUser, abdbPassWd, abdbDsn, abdbPort);
handle->connect();
handle->curTimeStamp = timeStamp;
}
改造后,用tuxedo单个测试,调用了5次没问题,第一次连接数据库,后面四次都不连接数据库。
用批量并发测试,tuxedo进程自增长后不报错,降落后也不报错。