ADO 資料庫連線斷開重連

2021-05-24 01:13:18 字數 2537 閱讀 3022

在使用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...