我有一个快速写入mysql数据库的C进程〜每秒10次。此过程使用MySql C连接器。
运行约2分钟后,进程挂起并在系统监视器中显示
"futex_wait_queue_me"
,还有
"Can't initialized threads: error 11"
打印到控制台,我假设是C连接器库(因为我不打印它)。在写入之后,与mysql的连接失败并带有
"MySQL server has gone away".
可能导致这种情况的原因是什么?我只是从一个帖子写作。
是的,我正在使用这个库。互联网锁定和解锁是未来因为我将多线程记录日志。实际应用中的日志事件将不那么频繁,但我试图在这个特定的测试中尽可能地强调它。//pseudocode:
while(1)
mutexlock
connect();
mysql_query();
disconnect();
sleep(100ms);
mutexunlock
A better solution, maybe not the best
connect();
while(1)
mutexlock
if error on mysql_query();
disconnect();
connect();
sleep(100ms);
mutexunlock
//connect/disconnect functions
int DBConnector::connect()
{
if(DBConnector::m_isConnected) return 0;//already connected...
if(!mutexInitialized)
{
pthread_mutex_init(&DBLock, 0);
}
if(mysql_library_init(0, NULL, NULL))
{
LoggingUtil::logError("DBConnector.DB_connect [DB library init error] " + string(mysql_error(&DBConnector::m_SQLHandle)));
DBConnector::m_isConnected = false;
return -1;
}
if((mysql_init(&m_SQLHandle)) == NULL)
{
LoggingUtil::logError("DBConnector.DB_connect [DB mysql init error] " + string(mysql_error(&DBConnector::m_SQLHandle)));
DBConnector::m_isConnected = false;
return -1;
}
if((mysql_real_connect(&DBConnector::m_SQLHandle, host.c_str(), user.c_str(), pw.c_str(), db.c_str(), port, socket.c_str(), client_flags)) == NULL)
{
LoggingUtil::logError("DBConnector.DB_connect [DB Connect error] " + string(mysql_error(&DBConnector::m_SQLHandle)));
DBConnector::m_isConnected = false;
return -1;
}
DBConnector::m_isConnected = true;
return 0;
}
int DBConnector::disconnect()
{
DBConnector::m_isConnected = false;
mysql_close(&DBConnector::m_SQLHandle);
mysql_library_end();
return 0;
}
答案 0 :(得分:1)
尽量不要打电话
mysql_library_init(0, NULL, NULL);
和
mysql_library_end();
每次连接尝试。
另外,你不想在每次mysql访问时重新连接的第二个想法要好得多,因为建立连接总是需要一些时间/资源。在你的情况下没有任何意义。
查询失败后,您无需重新连接到数据库。