我正在使用 Boost 线程(pthread)在 C++ 中编写一个多线程应用程序。该应用程序产生 100 个线程,每个线程执行以下任务(我正在编写将在每个线程中运行的代码片段):
try {
driver = get_driver_instance();
con = driver->connect(SettingsClass.HostName, \
SettingsClass.UserName,SettingsClass.Password);
// SettingsClass is a global static class whose members
// (HostName, UserName, Password, etc) are initialized once
// before *any* thread is created.
con->setSchema("MyDatabase");
driver->threadInit();
string dbQuery = "select A, B, C from XYZTable where D=?";
prepStmt = con->prepareStatement(dbQuery);
prepStmt->setInt(1, 1);
rSet = prepStmt->executeQuery();
/* Do Something With rSet, the result set */
delete rSet;
delete prepStmt;
if (con != NULL && !con->isClosed()) {
con -> close();
driver->threadEnd();
delete con;
}
catch (SQLException &e)
{
/* Log Exception */
}
在运行进程时(应用程序,如前所述,即有 100 个这样的线程),我在中途附加 gdb 并观察到超过 40% 的线程在 read() 调用中挂起。所有的回溯都有 mysql 库函数(vio_read() 等),没有一个来自我的代码,因为我的代码不执行任何 I/O。
谁能指出为什么会出现这个问题。我应该检查我的代码/网络还是 MySQL 服务器配置?我是否正确使用了 C++ 连接器库?