发文背景
近期项目需求使用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;
}
写在最后
- 项目再紧急,该做的准备还是要做呀。自己把官网文档过一遍,效果会不会更好呢?
- 此贴若有错误还望指正,希望能提供一些帮助。。呵呵。