在多线程环境中使用MySQL C ++ Connector

时间:2013-02-03 18:17:09

标签: c++ mysql boost

这是关于我对MySQL C ++ Connector的asked问题,以及我在多线程环境中使用的问题。

我有一个产生100个线程的应用程序。是的,我产生了100个,因为除了数据库更新之外,他们中的大多数都会忙于I / O或其他任务。

  1. 我有一个全局sql::Driver * driver变量,对整个应用程序都是可见的。我在应用程序一开始就调用了driver = get_driver_instance();
  2. 我有一个sql::Connection指针数组,connArray又是全局的,在产生任何线程之前,我为第i个线程打开第i个连接(使用driver),然后调用{{1 }}。我将此连接存储在connArray数组的第i个位置。
  3. 现在,这大致是我在我的应用程序中执行的操作(粗略代码):

    con->setSchema

    在执行此代码时,当我在四核Ubuntu服务器中运行我的应用程序时,间歇性地得到以下异常:

    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);
    }
    

    此外,有时(间歇性地再次!),来自Lost connection to MySQL server during query Error Code: 2013 SQL State: HY000 InsertFunction的executeUpdate挂起。我抓住了以下回溯:

    UpdateFunction

    有人可以指出我可能出错的地方,或者MySQL的C ++连接器库中有什么问题吗?

1 个答案:

答案 0 :(得分:0)

如果使用相同的连接句柄,则需要使用锁来保护对它的访问,因为低级别的MySQL连接API不是线程安全的。如果需要并行发送查询,请考虑为每个线程创建单独的MySQL连接句柄。