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 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;
}

写在最后

  1. 项目再紧急,该做的准备还是要做呀。自己把官网文档过一遍,效果会不会更好呢?
  2. 此贴若有错误还望指正,希望能提供一些帮助。。呵呵。
  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我叫大魔宝

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值