MySQL C连接器:从不同的线程执行查询

时间:2013-04-15 10:38:40

标签: mysql-connector mariadb mysql

我在应用程序的主线程中创建了与服务器的连接:

ClassA::ClassA(void)
{
    mpMySQL = mysql_init(NULL);

    if (!mysql_thread_safe())
    {
        // Error;
    }
}

稍后与服务器建立连接:

void ClassA::OpenConnection(/*inParams*/)
{
    .....
    mysql_real_connect(mpMySQL, /*inParams*/);
    .....
}

现在我使用mpMySQL来执行查询:

MyRes ClassA::SQLQuery(MyString inQuery)
{
   ...
    if (!mysql_real_query(mpMySQL, inQuery, inQuery.length()))
    {
    ...
    }
}

虽然应用程序在主线程中使用了ClassA的对象 - 但一切正常。

但是如果方法

A->SQLQuery()

从线程调用 - 应用程序在执行时崩溃

mysql_real_query()

==

据我所知,这是因为mpMySQL在一个线程中初始化并在另一个线程中使用。我是对的吗?

这样做的方法是什么?或者我应该在每个单独的线程中初始化MYSQL结构(并建立单独的连接)来执行查询?

1 个答案:

答案 0 :(得分:0)

mysql_thread_init()就是诀窍。您需要为使用C API的每个线程执行它。 mysql_init()隐式地做了。