我有多个线程需要连接到MySQL服务器的单个实例。 如果每个线程都创建并处理自己的连接,那么一切都按预期进行。 我想实现一个简单的连接池:
void query_user(MYSQL* conn)
{
mysql_thread_init();
std::ostringstream query;
query << "select * from user u where u.username = '" << "stack" << "'";
if (mysql_query(conn, query.str().c_str())) {
fprintf(stderr, "%s\n", mysql_error(conn));
exit(-1);
}
MYSQL_RES* res = mysql_use_result(conn);
MYSQL_ROW row;
while ((row = mysql_fetch_row(res)) != NULL) {
printf("%s %s %s %s %s %s %s %s %s\n",
row[0], row[1], row[2], row[3], row[4], row[5], row[6], row[7], row[8]);
}
mysql_free_result(res);
mysql_thread_end();
}
#define POOL_SIZE 2
int main(int argc, char** argv)
{
mysql_library_init(argc, argv, NULL);
// Create Connection pool
MYSQL* connection_pool[POOL_SIZE];
for (size_t i = 0; i < sizeof(connection_pool)/sizeof(MYSQL*); ++i) {
connection_pool[i] = mysql_init(NULL);
if (!mysql_real_connect(connection_pool[i], server,
user, password, database, 0, NULL, 0)) {
fprintf(stderr, "%s\n", mysql_error(connection_pool[i]));
exit(-1);
}
}
// Thread Pool
pthread_t thread_pool[POOL_SIZE];
for (size_t i = 0; i < sizeof(thread_pool)/sizeof(pthread_t); ++i) {
pthread_create(&thread_pool[i], NULL,
reinterpret_cast<void* (*)(void*)>(query_user),
(void*)&connection_pool[i]);
}
// join threads
for (size_t i = 0; i < sizeof(thread_pool)/sizeof(pthread_t); ++i) {
pthread_join(thread_pool[i], NULL);
mysql_close(connection_pool[i]);
}
mysql_library_end();
return 0;
}
我在mysql_real_query中有一个总线错误
你能指出它有什么问题吗? 连接池还有一些好处吗?
我正在链接libmysqlclient_r,这应该是线程安全的
谢谢,
答案 0 :(得分:2)
我认为有一些问题:
(void*)&connection_pool[i]
恕我直言应该是:
(void*)connection_pool[i]