Программирование >>  Программный интерфейс приложений 

1 ... 95 96 97 [ 98 ] 99 100 101 ... 264


Сравнение возможностей

mysql store resultО И mysql use result()

Функции mYsql store result() И mYsql use result{) подобны В том, что обе принимают аргумент дескриптора соединения и возвращают результирующий набор. Но между ними имеются существенные различия. Первое и главное различие заключается в том, каким образом результирующий набор выбирается с сервера. Функция mYsql store result () выбирает все строки сразу же после ее вызова. Функция mYsql use result () инициирует выборку, но в действительности не получает строк. Более того, ее использование предполагает, что после нее будет вызвана функция mYsql fetch row () для последующей выборки записей. Эти различия в выборке строк являются причиной всех остальных различий между этими двумя функциями. В этом разделе они сравниваются для того, чтобы дать возможность осознанного выбора разработчику профаммного обеспечения.

Функция mYsql store result () В процессе выборки результирующего набора с сервера производит собственно выборку, распределяет для него память, сохраняет его на компьютере клиента. Последующий вызов mYsql fetch row () никогда не возвращает ощибки, так как она просто выбирает сфоку из структуры данных, которые уже содержат результирующий набор. Возвращаемое значение NULL означает только, что достигнут конец результирующего набора.

Однако mysql use result () никогда сама не выбирает строк. Она просто инициирует посфочную выборку, которая будет заверщена, если для каждой строки вызвать процедуру mYsql f etch row (). В этом случае возвращение значения null из процедуры mYsql fetch row () может означать как достижение конца результирующего набора, так и возникновение ощибки в процессе работы сервера. Разобраться в различиях можно, только вызвав mYsql errno () или mYsql error {).

Процедура mYsql store result () потребляет больще памяти и вычислительных ресурсов, чем mYsql use result (). Это происходит потому, что вся обработка результирующего набора производится профаммой. При необходимости выборки большого количества данных одновременно может произойти ситуация, когда лучше воспользоваться процедурой mYsql use result () .

Процедура mYsql use result О фебует меньший объем памяти: ей достаточно столько памяти, сколько необходимо для размещения одной сфоки. Эта функция будет работать бысфее, потому что не пофебуется производить реконфигурации в зависимости от получаемых объемов. Но функция mYsql use result О сильно перефужает сервер, который должен хранить все сфоки результирующего набора до тех пор, пока клиент не соберется их выбрать. Следовательно, функция mysql use result {) -



не самый лучший выбор в качестве инструмента разработки профамм определенного класса.

Интерактивные клиентские профаммы, производящие посфоч-ный просмотр по запросу пользователя. (Сервер не должен ожидать посылки следующей сфоки только потому, что пользователь делает короткий перерыв в работе.)

Клиентские профаммы, производящие между выборками строк большой объем вычислений.

В обоих случаях клиент не имеет возможности бысфо выбрать все сфоки в результирующий набор. Это связывает сервер и может иметь отрицательное влияние на работу других клиентов, так как таблицы, из которых производится чтение, закрыты для чтения на все время, пока происходит выполнение запроса. Любой клиент, пытающийся внести изменения в эти таблицы или вставить новые строки, блокируется.

Возмещением расходов на дополнительную память, фебующуюся функции mysql store result (), является возможность получения доступа одновременно ко всему результирующему набору. Функции mysql data seek(), mysql row seek()и mysql row tell{) позволяют осуществить доступ к сфокам в любом нужном порядке. При работе с функцией mysql use result () доступ к сфокам возможен только в том порядке, в котором они бьши выбраны функцией mysqlf etch row (). При необходимости обрабатывать сфоки в любом другом порядке, отличающемся от последовательности, в которой они возвращены с сервера, нужно воспользоваться возможностями функции mysql store result (). Например, если разрабатываемое приложение должно разрешить пользователю просмафивать выбранные сфоки вперед и назад, что-нибудь лучше, чем mysql store result (), найти трудно.

Работая с функцией mysql store result (), можно получить такую информацию о столбцах, которую невозможно получить с помощью mysql use result (). Количество строк, полученных в результирующем наборе, можно получить с помошью функции mysql num rows (). Максимальная длина значений в каждой колонке сохраняется в элементе max width структуры MYSQL FIELD, хранящей информацию о столбцах обрабатываемой таблицы. Функции mysql use result () и mysql num rows () не возвращают точного значения до тех пор, пока не будут выбраны все строки, а maxwidth будет недоступна, так как она может быть просчитана только после того, как будут видны все данные во всех столбцах.

Так как функция mysql use result () выполняет меньше обработки чем mysql store result (), она фебует соблюдения особого условия: профамма-клиент должна вызывать функцию mysql f etch row () для каждой строки в результирующем наборе. В противном случае, любая оставшаяся в наборе запись попадает в результирующий набор следующего запроса, что вызывает появление ошибки out of sync ( рассинхронизация ). Та-



кая ситуация не может возникнуть в принципе при использовании функции mysql store result (), так как в тот момент, когда эта функция завершает работу, все строки результируюшего набора уже выбраны. Действительно, при работе с функцией mysql store result () необходимость вызывать функцию mysql fetch row () полностью отпадает. Такая возможность может понадобиться при обработке запросов, результаты которых нас интересуют только с той точки зрения, что получен пустой или непустой результи-руюший набор данных, а не собственно результируюшие данные. Например, для того, чтобы проверить факт существования таблицы mytbl, нужно выполнить следующий запрос:

SHOW TABLES LIKE my tbl

Пусть после отработки функции mysql store result () mysql num rows () возвратит ненулевое значение. Следовательно, таблица существует. Функцию mysql f etch row () вызывать не надо.

Можно предоставить пользователям самим выбирать способ обработки данных. Кстати профаммы mysql и mysqldijmp такой выбор предоставляют. По умолчанию они используют mysql store result {). Но имеется возможность переключения на режим использования mysql use result {). Для этого необходимо задать ключ - -quick.

Метаданные результирующего запроса

Результирующий набор содержит не только значения, хранящиеся в столбцах, но и информацию о данных. Эта информация называется метаданными результирующего набора и включает следующие элементы.

Количество строк и столбцов в результирующем наборе, которые можно получить, вызвав функции mysql numrows () и mysql num f ields() .

Длину каждого столбца в сфоке, которую можно получить, вызвав функцию mysql fetch lengths().

Такую информацию о каждой сфоке, как имя столбца и его тип, максимальную длину значения, хранящегося в каждом столбце, и имя таблицы, которой этот столбец принадлежит. Эти данные хранятся в сфуктурах типа MYSQL FIELD, которые можно получить, вызвав mysql fetch f ield (). Сфуктура MYSQL FIELD детально описана в приложении Е, Программный интерфейс приложений С . Там же можно найти список всех функций, обеспечивающих доступ к информации, содержащейся в структуре.

Доступность метаданных частично зависит от метода обработки результируюшего набора. Как это показано в предьщущем разделе, если необходимо узнать количество сфок или максимальные длины значений столбцов для создания результирующего набора, вызовите функцию

mysql store result{), а не mysql use result().



1 ... 95 96 97 [ 98 ] 99 100 101 ... 264

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика