MySQL C API-在调用MySQL_store_result()或MySQL_stmt_store_result()之后重新使用连接

MySQL C API-在调用MySQL_store_result()或MySQL_stmt_store_result()之后重新使用连接,mysql,mysql++,libmysql,Mysql,Mysql++,Libmysql,对于“Select”sql,在通过调用my_xxxx_store()API从缓存的结果集复制所有行(通过调用my_xxxx_store()API)之前,多次重用调用my_xxxx_store()API(将所有结果缓存到客户端)的连接是否安全 例如,如果通过传递不同的select语句从多个线程调用此函数,则此函数是否正确地获取数据,而不会出现任何问题。 就像同时打电话一样 From thread-1: foo("select * from table1"); From thread-2: foo(

对于“Select”sql,在通过调用my_xxxx_store()API从缓存的结果集复制所有行(通过调用my_xxxx_store()API)之前,多次重用调用my_xxxx_store()API(将所有结果缓存到客户端)的连接是否安全

例如,如果通过传递不同的select语句从多个线程调用此函数,则此函数是否正确地获取数据,而不会出现任何问题。 就像同时打电话一样

From thread-1: foo("select * from table1");
From thread-2: foo("select * from table2");
From thread-3: foo("select * from table3");
etc....
函数foo类似于

/* Assume that "connection" is a valid properly initialiaed mysql connection handle global variabale*/
/* Assume that there is only one result set. (Means that we dont need to call mysql_next_result() ) */
foo( char *sqlStatement )
{
    threadLock();
    mysql_real_query( connection, sqlStatement, ... );
    MYSQL_RES* result = mysql_store_result(connection);
    threadUnLock();
    /* The "connection" can be reused now, since all data is cached in client. */

    while( more data rows )
    {
        MYSQL_ROW row = mysql_fetch_row(result);
        /*
           Copy data;
        */
    }
    mysql_free_result(result);
}
bar( char *sqlStatement, char *params[] )
{
    threadLock();
    MYSQL_STMT *stmt = mysql_stmt_init(connection);
    mysql_stmt_prepare(stmt, sqlStatement, ...);
    int paramCount= mysql_stmt_param_count(stmt);
    MYSQL_RES *metaResult = mysql_stmt_result_metadata(stmt);
    int columnCount= mysql_num_fields(metaResult)
    mysql_stmt_execute(stmt);
    mysql_stmt_bind_result(stmt, ....)
    mysql_stmt_store_result(stmt);
    threadUnLock();
    /* The "connection" can be reused now, since all data is cached in client. */

    while( more data rows )
    {
        MYSQL_ROW row = mysql_stmt_fetch(stmt);
        /*
           Copy data;
        */
    }
    mysql_free_result(metaResult);
    mysql_stmt_free_result(stmt);
    mysql_stmt_close(stmt);
}
准备好的报表也安全吗?差不多

/* Assume that "connection" is a valid properly initialiaed mysql connection handle global variabale*/
/* Assume that there is only one result set. (Means that we dont need to call mysql_next_result() ) */
foo( char *sqlStatement )
{
    threadLock();
    mysql_real_query( connection, sqlStatement, ... );
    MYSQL_RES* result = mysql_store_result(connection);
    threadUnLock();
    /* The "connection" can be reused now, since all data is cached in client. */

    while( more data rows )
    {
        MYSQL_ROW row = mysql_fetch_row(result);
        /*
           Copy data;
        */
    }
    mysql_free_result(result);
}
bar( char *sqlStatement, char *params[] )
{
    threadLock();
    MYSQL_STMT *stmt = mysql_stmt_init(connection);
    mysql_stmt_prepare(stmt, sqlStatement, ...);
    int paramCount= mysql_stmt_param_count(stmt);
    MYSQL_RES *metaResult = mysql_stmt_result_metadata(stmt);
    int columnCount= mysql_num_fields(metaResult)
    mysql_stmt_execute(stmt);
    mysql_stmt_bind_result(stmt, ....)
    mysql_stmt_store_result(stmt);
    threadUnLock();
    /* The "connection" can be reused now, since all data is cached in client. */

    while( more data rows )
    {
        MYSQL_ROW row = mysql_stmt_fetch(stmt);
        /*
           Copy data;
        */
    }
    mysql_free_result(metaResult);
    mysql_stmt_free_result(stmt);
    mysql_stmt_close(stmt);
}