MySQL多執行緒環境下的操作要點
- 發文背景
- 問題描述
- 定位問題
- 上demo
- 寫在最后
發文背景
近期專案需求使用MySQL進行業務邏輯互動,故學習了相關知識,學習路徑就不贅述了,我選的是官方檔案:見鏈接: MySQL官方檔案.
運行環境
OS:REDHAT-7+ 64 x86
編程語言:C
問題描述
由于需要操作的資料庫表增多,需要再引入一個新的執行緒進行處理,功能代碼編輯完之后發現:盡管
- 邏輯無誤
- mysql_cmd陳述句是合法的,
- 兩個執行緒使用的是兩個獨立的MySQL句柄,
當進行mysql_query(MySQL的陳述句呼叫API)操作時,總是出現
MySQL server has gone away
的log提醒,
定位問題
初步將問題定位在句柄的合法性上,經過判斷句柄沒有問題,
那么基本可以確定,剩下的影響因素即多執行緒環境;
經查證,MySQL的多執行緒初始化需要用戶主動處理,
參考地址:
mysql多執行緒問題.
官方手冊解答.
上demo
// c/c++ code block
/**
*@brief : init a posix thread for more logical processing
*@param[in] : name of database
*@retval : NULL
*/
void child_mysql_proc(void* database_name)
{
MYSQL* child_mysql_handle = malloc(sizeof(MYSQL));///< 子執行緒句柄
mysql_thread_init();
mysql_init(child_mysql_handle );
if(!mysql_real_connect(child_mysql_handle ,\
"127.1","demo","123456",(char*)database_name,3306,NULL,0))
{
zlog_error(g_zlog_handle,"%s conncect failed\n" ,(char*)database_name );
}
mysql_thread_end();
}
int main(int argc ,char* argv[])
{
/*demo陳述句盡量簡明清晰,暫不考慮健壯性*/
MYSQL* master_mysql_handle = malloc(sizeof(MYSQL)); ///< 主執行緒句柄
char* database_name = "mysql_demo_test";
/*MySQL會為除錯庫使用的執行緒創建與執行緒相關的變數*/
mysql_thread_init();
mysql_init(master_mysql_handle);
if(!mysql_real_connect(master_mysql_handle ,\
"127.1","demo","123456",database_name,3306,NULL,0))
{
zlog_error(g_zlog_handle,"%s conncect failed\n" ,database_name );
mysql_quit("mysql connect error,please check the log"); ///< 自己封裝的mysql回收函式
}
mysql_thread_end();
pthread_t demo_child_thread; ///< 子執行緒id
int ret_thr = pthread_create(&demo_child_thread, NULL, (void *)&child_mysql_proc, (void *)database_name );
return 0;
}
寫在最后
- 專案再緊急,該做的準備還是要做呀,自己把官網檔案過一遍,效果會不會更好呢?
- 此貼若有錯誤還望指正,希望能提供一些幫助,,呵呵,
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/401724.html
標籤:其他
上一篇:如何使用python將url中的影像保存到mongodb中?
下一篇:Java-如何避免SQL注入漏洞
