IDbHelper接口NewTableHandler实现增强
来源:互联网 发布:apple mac mini 编辑:程序博客网 时间:2024/04/30 11:24
某托管服务器崩溃产生了crash,经惠礼分析定位到missive插件中处理消息执行下面的调用时返回NULL,后续对th的访问导致崩溃:
ITableHandler *th = CBasePluginModule::db_helper_->NewTableHandler(pdbor,"tb_6016");
使用IDbHelper接口NewTableHandler创建表处理器对象,用来操纵数据库.避免编写SQL.
GETDBC(pdbor,this->local_dbc_.c_str()); ITableHandler *th = CBasePluginModule::db_helper_->NewTableHandler(pdbor,"tb_6016"); AUTO_POINTER_NODECLARE(ITableHandler,th); th->BindField("missive_id",(char*)strmissive_id.c_str(),0); th->BindField("missive_name",(char*)strmissive_name.c_str(),0);
NewTableHandler实现代码如下:
ITableHandler* HTX_DB_Helper::NewTableHandler(CDbAccessor *pdbor,const char *tbl_name) { CTableInfo *tbl; string s = StringToUpper(tbl_name); tbl = this->FindTable(s.c_str()); if (tbl==NULL) tbl = this->OpenTable(pdbor,s.c_str()); CTableHandler *th = 0; if (tbl) { th = new CTableHandler; th->Attach(tbl); th->SetDbAccessor(pdbor); } return th; }
在执行OpenTable时,如果出现数据库访问故障(如网络或者数据库系统原因),就可能导致返回的th为NULL.
此问题以前从发现过。采用的方式是在服务器启动时预先执行,初始化后再出现数据库访问故障不会导致问题,,因为表的模式信息已被缓存。
如bbox插件的处理如下:
int CBBoxPlugin::CheckValid(){ parent::CheckValid(); InitTableHandler("tb_0032"); InitTableHandler(REDO_TABLE_NAME); return 0;}int CBBoxPlugin::InitTableHandler(const char *tbl_name) { do { GETDBC(pdbor,this->local_dbc_.c_str()); ITableHandler *th = db_helper_->NewTableHandler(pdbor,tbl_name); AUTO_POINTER_NODECLARE(ITableHandler,th); if (th) break; ACE_OS::sleep(1); }while(1); return 0;}
以上是一种处理问题的方法。
更简单和彻底的解决办法是修改NewTableHandler的实现,升级hotfox。
修改后的代码如下:
<p>ITableHandler* HTX_DB_Helper::NewTableHandler(CDbAccessor *pdbor,const char *tbl_name) { CTableInfo *tbl; string s = StringToUpper(tbl_name); tbl = this->FindTable(s.c_str()); if (tbl==NULL) { CDbAccessor2 *p = dynamic_cast<CDbAccessor2*>(pdbor); const char *dbc_name = p->GetPool()->dbcc_->name.c_str(); do { CDbAccessor *new_pdbor = HTX_DBPOOL::instance()->GetDbConnection(dbc_name,-1,true,true); tbl = this->OpenTable(new_pdbor,s.c_str()); HTX_DBPOOL::instance()->ReleaseDbConnection(new_pdbor); }while(tbl==0); } CTableHandler *th = 0; if (tbl) { th = new CTableHandler; th->Attach(tbl); th->SetDbAccessor(pdbor); }</p><p> return th; }</p>
0 0
- IDbHelper接口NewTableHandler实现增强
- 通用数据库访问接口IDBHelper
- (05)通用的数据访问接口 IDbHelper
- (05)通用的数据访问接口 IDbHelper
- 接口增强
- 环绕增强MethodInterceptor接口
- 增强的接口
- 用户出口-GUI接口增强-屏幕增强
- JavaSE--学习实战完全笔记--增强版的线程创建方式--实现Callable接口
- spring切面:接口:环绕增强
- spring切面:接口:异常增强
- 前置增强的实现
- 后置增强的实现
- matlab实现图像增强
- SAP MM 一些增强接口记录
- SAP 金税接口增强 BADI
- SAP 金税接口增强 BADI
- java8新特性之接口定义增强
- II协议
- JQuery的Ajax跨域请求的解决方案(续)
- as3中的get和set关键字的作用
- 遗传算法解决TSP问题(C++)
- c++ primer plus第十章习题答案
- IDbHelper接口NewTableHandler实现增强
- ubuntu 换镜像源(下载由慢变快)
- android控件开发之ListView
- windows下Apache2.2.17+2个tomcat6.0.20集群(新手)
- 开发问题集
- CSU 1271: Brackets Sequence(数学啊 )
- MySQL性能优化的最佳20+条经验
- 数据库行转列的sql语句 (抛砖引玉)
- iBATIS创建操作