在单例中少用static的解决方案

    由于单例和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指向一个staticAltibaseIntf,改为指向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.hAltibaseIntf增加成员变量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进程自增长后不报错,降落后也不报错。