MySQL多线程环境下的操作要点

MySQL多线程环境下的操作要点

发文背景

近期项目需求使用MySQL进行业务逻辑交互,故学习了相关知识。学习路径就不赘述了,我选的是官方文档:见链接: MySQL官方文档.

运行环境
OS:REDHAT-7+ 64 x86
编程语言:C

问题描述

由于需要操作的数据库表增多,需要再引入一个新的线程进行处理。功能代码编辑完之后发现:尽管

  1. 逻辑无误
  2. mysql_cmd语句是合法的,
  3. 两个线程使用的是两个独立的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 failedn" ,(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 failedn" ,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;
}

写在最后

  1. 项目再紧急,该做的准备还是要做呀。自己把官网文档过一遍,效果会不会更好呢?
  2. 此贴若有错误还望指正,希望能提供一些帮助。。呵呵。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码

)">
< <上一篇
下一篇>>