MySQL C++连接器在多线程环境中的使用
Use of MySQL C++ Connector in multi-threaded environment
这是关于我问过的关于MySQL C++连接器的问题,以及我在多线程环境中使用它时面临的问题。
我有一个生成100个线程的应用程序。是的,我生成了100个,因为它们中的大多数都忙于I/O或其他任务,而不是数据库更新。
- 我有一个全局
sql::Driver * driver
变量,它对整个应用程序都可见。我在应用程序一开始就调用driver = get_driver_instance();
- 我有一个
sql::Connection
指针数组,connArray也是全局的,在生成任何线程之前,我打开第I个线程的第I个连接(使用driver
),并调用con->setSchema
。我将此连接存储在connArray数组的第I个位置
现在,这大致是我在应用程序中执行的操作(粗略代码):
bool InsertFunction(int threadId)
{
driver->threadInit(); //Driver is global
if((connArray[threadId] == NULL) || (connArray[threadId] == NULL && connArray[threadId]->isClosed())
{
//Re-Create the connection and store in the connArray
}
else
{
Create Prepared Statement for Insert
Set Values
Execute Update
}
driver->threadEnd();
}
bool UpdateFunction(int threadId)
{
driver->threadInit(); //Driver is global
if((connArray[threadId] == NULL) || (connArray[threadId] == NULL && connArray[threadId]->isClosed())
{
//Re-Create the connection and store in the connArray
}
else
{
Create Prepared Statement for Update
Set Values
Execute Update
}
driver->threadEnd();
}
/* Global Region */
sql::Driver * driver;
sql::Connection * connArray[100];
int main()
{
Array of connections created
Threads created (I use boost library)
Post a Job to Boost Thread, RunTask(threadId)
return 0;
}
RunTask(int threadId)
{
InsertFunction(threadId);
pid_t pid = fork();
if(pid == 0)
/* Child does some processing */
else
/* Parent Waits */
UpdateFunction(threadId);
}
在执行此代码时,当我在四核Ubuntu服务器中运行应用程序时,我会间歇性地出现以下异常:
Lost connection to MySQL server during query Error Code: 2013 SQL State: HY000
此外,有时(再次间歇性!),从InsertFunction
或UpdateFunction
执行更新会挂起。我捕获了以下回溯:
(gdb) bt
#0 0x00007fbd55affd2d in read () from /lib/x86_64-linux-gnu/libpthread.so.0
#1 0x00007fbd54398412 in vio_read_buff () from /usr/lib/x86_64-linux-gnu/libmysqlclient.so.18
#2 0x00007fbd5438a51f in ?? () from /usr/lib/x86_64-linux-gnu/libmysqlclient.so.18
#3 0x00007fbd5438b0b8 in my_net_read () from /usr/lib/x86_64-linux-gnu/libmysqlclient.so.18
#4 0x00007fbd543846ba in cli_safe_read () from /usr/lib/x86_64-linux-gnu/libmysqlclient.so.18
#5 0x00007fbd543857e8 in ?? () from /usr/lib/x86_64-linux-gnu/libmysqlclient.so.18
#6 0x00007fbd54381194 in ?? () from /usr/lib/x86_64-linux-gnu/libmysqlclient.so.18
#7 0x00007fbd54381a07 in cli_stmt_execute () from /usr/lib/x86_64-linux-gnu/libmysqlclient.so.18
#8 0x00007fbd54382aed in mysql_stmt_execute () from /usr/lib/x86_64-linux-gnu/libmysqlclient.so.18
#9 0x00007fbd55dddb40 in sql::mysql::NativeAPI::LibmysqlStaticProxy::stmt_execute (this=0x860670,
stmt=0x7fbd140236c0)
at /mysql/mysql-src/mysql-connector-c++-1.1.1/driver/nativeapi/libmysql_static_proxy.cpp:475
#10 0x00007fbd55ddfa61 in sql::mysql::NativeAPI::MySQL_NativeStatementWrapper::execute (
this=0x7fbd1403b0a0)
at /mysql/mysql-src/mysql-connector-c++-1.1.1/driver/nativeapi/mysql_native_statement_wrapper.cpp:131
#11 0x00007fbd55dbf30d in sql::mysql::MySQL_Prepared_Statement::do_query (this=0x7fbd140233f0)
at /mysql/mysql-src/mysql-connector-c++-1.1.1/driver/mysql_prepared_statement.cpp:423
#12 0x00007fbd55dbf9be in sql::mysql::MySQL_Prepared_Statement::executeUpdate (this=0x7fbd140233f0)
at mysql/mysql-src/mysql-connector-c++-1.1.1/driver/mysql_prepared_statement.cpp:531
---Type <return> to continue, or q <return> to quit---
#13 0x0000000000440d96 in SomeNameSpace::SomeClass::InsertFunction ( this=0x7fbd14026930, threadId=11)
at h/SomeClass.h:295
有人能指出我哪里出了问题吗?或者MySQL的C++连接器库有什么问题吗?
如果您使用相同的连接句柄,则需要使用锁来保护对其的访问,因为MySQL连接API在底层不是线程安全的。如果您需要并行发送查询,请考虑为每个线程创建单独的MySQL连接句柄。
相关文章:
- 如何正确取消析构函数中的 Boost deadline_timer(在多线程环境中)?
- 为什么添加延迟会提高此多线程环境中的数据吞吐量?
- Qt::D irectConnection在多线程环境中使用时如何工作?
- 在多线程环境中正确销毁对象
- 多线程环境中C++内存访问
- 为多线程环境包装 c++ new/delete 的安全/好方法
- 在多线程环境中使用 std::call_once() 初始化
- 在多线程环境中交换C 地图对象
- 在多线程环境中使用 libcurl 会导致与 DNS 查找相关的性能非常慢
- 暂停和恢复多线程环境中另一个线程的线程C++技术建议
- 在多线程环境中,什么可能导致"bad file descriptor"?
- 多线程环境中的输出字符串流出现问题
- 信号处理程序在多线程环境中的功能
- 在多线程环境中使用Mysql++的问题
- C++-SQLite3在多线程环境中泄漏句柄
- 如何改进此代码以便在多线程环境下运行
- 在多线程环境中使用atomic保护两个变量
- 多线程环境中的文档锁定
- XSetWMProtocols 和 glXCreateContext 在多线程环境中调用顺序
- 多线程环境 (OpenMP) 中的 OpenCV 会导致分段错误