在使用ado的過程中,最理想的操作流程:
程式啟動,開啟資料庫連線,在程式退出前,一直保持這個連線。程式退出時,才關閉該連。
最理想的狀態的前提:該資料庫連線在中間不會斷開。不會由於網路或者資料庫伺服器的原因導致連線斷開。
實際情形是:需要開發乙個長時間執行的程式,資料庫伺服器可能在很遠的地方,網路不可靠。人工在連線斷開的時候不可能及時的干預。最好的方式就是程式能夠檢測到連線斷開,並且能夠自動重新連線。
檢測資料庫連線斷開很簡單:在斷開的資料庫連線物件上執行sql語句或者開啟資料集會導致資料異常,捕獲該異常時,就可知道資料庫連線斷開了。
在實際重新連線資料時,出現以下問題:
1. cadodatabase m_database
對應的資料庫連線在程式啟動時連線正常,在重連時,先呼叫close方法,再呼叫open方法,open方法直接返回成功,在該連線上執行sql語句,出現異常: 未連線到資料庫。 這說明: 已經連上資料庫物件m_database在斷開連線,重新open時,不會真正從新開啟連線。
2. 如果在同乙個執行緒中,動態建立cadodatabase 物件,用新物件開啟鏈結,同樣存在上面的問題。
由於ado類實際是com類,考慮com物件跟執行緒的關係,採用如下方法實現在連線斷開的情況下嘗試重新連線。
1. 為每個資料庫連線物件 cadodatabase 啟動乙個執行緒,作為該com物件的執行緒住所。
2. 資料庫連線物件 cadodatabase 採用動態建立,即每次建立乙個執行緒,同時建立乙個新的cadodatabase物件。
例程:m_dbcenter.setdbparms(m_datasource,m_userid,m_password);
m_dbcenter.setdrivertype(m_dbdrivertype);
m_dbcenter.settableparms(m_table,m_table2);
m_bdbinit = false;
::coinitialize(null);
while(true)
if(m_bdbinit)
// info = "連線資料庫1...";
showinfo(info);
if (! m_dbcenter.init())
else}}
cdbcenter 類:
class cdbcenter
bool init();
void uninit();
private:
cadodatabase *m_pdatabase;
bool cdbcenter::init()
else
strconnectstring += m_strdatasource.c_str();
strconnectstring += ";";
m_pdatabase = new cadodatabase();
m_pdatabase->setconnectiontimeout(30);
bool rs;
rs = m_pdatabase->open(strconnectstring.c_str(),m_struserid.c_str(),m_strpassword.c_str());
if (rs == false)
return false;
m_pdatabase->m_pconnection->putcommandtimeout(30);
// std::string strsql = "select * from all_tables where rownum < 2";
bool success = (true == m_pdatabase->execute(strsql.c_str()));
trace("init return %d/r/n",success ? "true" : "false");
return success;
}void cdbcenter::uninit()
}主工作執行緒對資料庫連線的重連操作:
std::string info;
info = "工作執行緒啟動...";
showinfo(info);
labcheckdb:
dberror = false;
// 通過該資料庫連線執行資料庫操作
exist = m_dbcenter.readdata(value, dberror);
if(dberror)
while(dberror)
// 資料庫1 初始化執行緒退出 重新初始化
unintdb();
sleep(2000);
m_bdbinit = false;
m_binitdbthreadexit = false;
m_dbinittimes = 0;
// 啟動資料庫連線線程
initdb();
while(m_dbinittimes < 1)
// 嘗試一次 判斷是否連上
if (! m_bdbinit)
// 已經連上,重新執行上面的資料庫操作
goto labcheckdb;}
ADO 資料庫連線
這些天一直在學習ado 資料庫連線,感覺比較複雜,所以一邊學習,一邊使用,一邊做了一些筆記,下面的一些東西就是我總結的一些關於ado 1 導入庫檔案 使用ado前必須在工程的stdafx.h檔案最後用直接引入符號 import引入ado庫檔案,以使編譯器能正確編譯。如下 import c progr...
ADO 資料庫連線
這些天一直在學習ado 1 導入庫檔案 使用ado前必須在工程的stdafx.h檔案最後用直接引入符號 import引入ado庫檔案,以使編譯器能正確編譯。如下 import c program files common files system ado msado15.dll no namespa...
資料庫重連
4.2.10 資料庫自動重連 dbcp使用apache的物件池objectpool作為連線池的實現,在構造genericobjectpool時,會生成乙個內嵌類evictor,實現自runnable介面。如果 timebetweenevictionrunsmillis大於0,每過 timebetwe...