在单例中少用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进程自增长后不报错,降落后也不报错。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值