MySQL C API - повторное использование соединения сразу после вызова mysql_store_result() или mysql_stmt_store_result()
Для sql "Select", безопасно ли повторно использовать соединение для вызова API my_xxxx_store () (для кэширования всех результатов в клиенте) несколько раз, прежде чем мы скопируем все строки, вызвав API my_fetch_xxx () из наборов результатов, которые кэшируется вызовом my_xxxx_store() API?
Например, правильно ли эта функция извлекает данные без каких-либо проблем, если они вызываются из нескольких потоков, путем передачи различных операторов выбора. Нравится одновременно звонить
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);
}