一个多线程引发的血案!!!1

icefox97 2009-09-12 12:15:13
各位大虾,小弟最近写了一个项目,这个是个游戏的LOGIN服务器(当然已经采用了多线程).数据库用的是Mysql.
在执行这样一个存储过程的时候,人少的时候不会有问题,但是进行压力测试的时候人一多,mysql_real_query(pMySql, query, (unsigned int)strlen(query))),这句话就会执行有问题.想了很久找不到解决的方法.跪求大侠们指点一下~~!
//----------------------------------------------------------------------------------------------------
char query[80];
sprintf_s(query, "call User_Login(%d,'%s',@ret)", uid, strKey.GetBuffer());

if(!mysql_real_query(pMySql, query, (unsigned int)strlen(query)))
{
//执行成功后的操作
}
else
{
//失败时候的操作
}
当然执行的存储过程很简单,只是返回一个值~~!
//-------------------------------------------------------------------------------------------------------
...全文
241 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
icefox97 2009-09-14
  • 打赏
  • 举报
回复
现在我的治标的解决方法是,在产生连接断开之后,用mysql_connect()再进行连接,然后执行前面断开前做的事情~~
但是,有没有治本的方法~
gcc_gun 2009-09-14
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 mengde007 的回复:]
有什么问题;说清楚;为什么总让我们问下;
[/Quote]
哈,老手了~~~
icefox97 2009-09-14
  • 打赏
  • 举报
回复
还有哪位大虾,能指点一下嘛~·
icefox97 2009-09-14
  • 打赏
  • 举报
回复
------------------------------------------------------------------
char query[80];
sprintf_s(query, "call User_Login(%d,'%s',@ret)", uid, strKey.GetBuffer());

for(int i=0; i <16; i++)
{
if (GetLock() == true)
{
if(!mysql_real_query(pMySql, query, (unsigned int)strlen(query)))
{
//执行成功后的操作
}
else
{
//失败时候的操作
}
}
usleep(50);
}
Unlock();
------------------------------------------------------------------
13楼这个做法,我已经试验过。程序中的错误就出现再加锁与解锁之间。不知道有没有别的办法~!
zhengyinhe 2009-09-14
  • 打赏
  • 举报
回复
// 在Query之前,加上一个获取锁的操作,如果OK了,在进行下面
// 事情搞完了,解锁
// 这样也存在一个风险,就是如果在上锁和解锁之间出现问题,解锁失败的话,会导致后面的Query都进不来
char query[80];
sprintf_s(query, "call User_Login(%d,'%s',@ret)", uid, strKey.GetBuffer());

for(int i=0; i<16; i++)
{
if (GetLock() == true)
{
if(!mysql_real_query(pMySql, query, (unsigned int)strlen(query)))
{
//执行成功后的操作
}
else
{
//失败时候的操作
}
}
usleep(50);
}
Unlock();
icefox97 2009-09-14
  • 打赏
  • 举报
回复
--!没办法现在这个别人已经完全做好的东西,上面压力测试一搞就受不了!!!不解决不行哦
icosagon 2009-09-14
  • 打赏
  • 举报
回复
环境比较苛刻的时候就不要用MYSQL这种不像数据库的数据库了
icefox97 2009-09-14
  • 打赏
  • 举报
回复
经过测试已经找到了错误原因,在同时有大量Login的时候,mysql_real_query(pMySql, query, (unsigned int)strlen(query))) 就会挂掉
用mysql_error捕捉后,错误原因是Lost connection to MySQL server during query
,然后发生这个错误后后面再执行存储过程的时候就都报MySQL server has gone away
这个错误!小弟经验不足,有什么解决的好办法吗?
icefox97 2009-09-14
  • 打赏
  • 举报
回复
举个例子,我现在将登陆的限制去掉,自己开了10个登陆窗口,在1~2秒内全部点连接,有的时候就会连接丢失~
herman~~ 2009-09-14
  • 打赏
  • 举报
回复
不知道人多是去到多少并发

另外,并不是采用多线程就一定能提高程序的效率,需要根据不同情况做不同的处理
icefox97 2009-09-12
  • 打赏
  • 举报
回复
顶呀!!!
icefox97 2009-09-12
  • 打赏
  • 举报
回复
人多的LOGIN的时候,我查了数据库的表里面,根本就没有
mysql_real_query(pMySql, query, (unsigned int)strlen(query))
执行后的记录..
感觉人多的时候并发操作有问题.
这个执行的时候已经用临界区进行保护了`
crst_zh 2009-09-12
  • 打赏
  • 举报
回复
问题应该在query上,多线程,这个东西保护了吗?
mengde007 2009-09-12
  • 打赏
  • 举报
回复
有什么问题;说清楚;为什么总让我们问下;
icefox97 2009-09-12
  • 打赏
  • 举报
回复
--!真是有难处呀~~!想了2天了找不到原因!
ttklboy 2009-09-12
  • 打赏
  • 举报
回复
标题党
aizibion 2009-09-12
  • 打赏
  • 举报
回复
你确定进入临界区的时候,参数均是正确得吗,你确定你得参数被改变得地方均使用同一个临界区吗?
thy38 2009-09-12
  • 打赏
  • 举报
回复
我不懂,只能帮顶
icefox97 2009-09-12
  • 打赏
  • 举报
回复
up

64,683

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧