c資料庫連接超時
1、配置ODBC數據源。
2、使用sql函數進行連接。
對於1、配置數據源,配置完以後就可以編程操作資料庫了。
對於2、使用SQL函數進行連接,參考代碼如下:
#include
#include
#include
voidmain()
{
HENVhenv;//環境句柄
HDBChdbc;//數據源句柄
HSTMThstmt;//執行語句句柄
unsignedchardatasource[]="數據源名稱";//即源中設置的源名稱
unsignedcharuser[]="用戶名";//數襲此據庫的帳戶拍野迅名
unsignedcharpwd[]="密碼";//資料庫的密碼
unsignedcharsearch[]="selectxmfromstuwherexh=0";
SQLRETURNretcode;//記錄各SQL函數的返回情況
//分配環境句柄
retcode=SQLAllocEnv(&henv);//等介於(SQL_HANDLE_ENV,SQL_NULL
,&henv);
//設置ODBC環境版本號為3.0
retcode=(henv,SQL_ATTR_ODBC_VERSION,(void*)SQL_OV_ODBC3,0);
//分配連接句柄
retcode=(henv,&hdbc);//等介於(SQL_HANDLE_DBC,henv,&hdbc);
//設置連接屬性,登錄超時為*rgbValue秒(可以沒有)
//(hdbc,SQL_LOGIN_TIMEOUT,(SQLPOINTER)(rgbValue),0);
//直接連接數據源
//如果是windows身份驗證,第二、三參數可以是
,也可以是任何字串
//SQL_NTS即"
retcode=SQLConnect(hdbc,datasource,SQL_NTS,user,SQL_NTS,pwd,SQL_NTS);
//分配語句句柄
retcode=(hdbc,&hstmt);//等介於(SQL_HANDLE_STMT,hdbc,&hstmt);
//直接執行查詢語句
retcode=(hstmt,search,SQL_NTS);
//將數據緩沖區綁定資料庫中的相應脊塵欄位(i是查詢結果集列號,queryData是綁定緩沖區,BUFF_LENGTH是緩沖區長度)
SQLBindCol(hstmt,i,SQL_C_CHAR,queryData[i-1],BUFF_LENGTH,0);
//遍歷結果集到相應緩沖區queryData
SQLFetch(hstmt);
/*
*對遍歷結果的相關操作,如顯示等
*/
//注意釋放順序,否則會造成未知錯誤!
(SQL_HANDLE_STMT,hstmt);
(hdbc);
(SQL_HANDLE_DBC,hdbc);
(SQL_HANDLE_ENV,henv);
}
『貳』 MySQL的各種網路IO超時的用法和實現
在MySQL的C API中,通過mysql_options函數調整mysql_init創建的連接對象屬性,可以設置連接和讀寫操作的超時時間,單位為秒。這些選項包括MYSQL_OPT_CONNECT_TIMEOUT、MYSQL_OPT_READ_TIMEOUT和MYSQL_OPT_WRITE_TIMEOUT。如果在規定時間內未收到伺服器響應,C API的查詢函數會返回超時錯誤。
配置文件中,通過connect-timeout和interactive-timeout分別設置連接和交互超時,連接超時在連接mysql server時生效,而interactive-timeout則影響互動式連接的會話超時,通常用於手動操作,優先於客戶端自定義值。
MySQL Server內部涉及多個與網路IO相關的超時變數,如connect_timeout、net_read_timeout、net_write_timeout、slave_net_timeout、interactive_timeout和wait_timeout。connect_timeout在登錄階段作為網路讀寫超時,而net_read_timeout和net_write_timeout在會話期間用於處理讀寫操作的超時。slave_net_timeout應用於slave與master的通信,wait_timeout則是會話默認超時,interactive_timeout則會作為wait_timeout的設置值。
實現超時的方法依賴於系統調用,如Linux的connect()和poll(),通過設置非阻塞模式並設置超時參數來實現。連接超時通過vio_socket_connect()和vio_io_wait(),讀寫超時則通過vio_read()、vio_write()和vio_socket_io_wait()配合MSG_DONTWAIT標志進行。會話超時在伺服器端通過檢查THD類的會話狀態來實現,當超時達到,相關會話將被銷毀。