СТАТЬЯ
28.06.02

Создание прикладных программ
для работы с SQLBase

Материал был опубликован на сайте Gupta Technologies LLC.
Переведено БНТП по заказу Interface Ltd.

Введение

Этот раздел описывает различные методы доступа к SQLBase и использования ее функциональных возможностей. Прикладные программы можно создавать с помощью большого набора интерфейсов прикладного программирования (API), которые поставляются с SQLBase, включая уникальный встроенный API для С и C++ (уникальность его в том, что в одном API представляет все функциональные возможности SQLBase); интерфейсы API промышленного стандарта и интерфейсы API, настроенные на конкретную среду разработки. На этих интерфейсах могут строиться новые прикладные программы, а уже существующие программы (или их части) можно легко перенести на SQLBase.

В дополнение к API-интерфейсам для большинства сред разработки приложений, SQLBase предоставляет инструменты и функциональные возможности, характерные для того окружения, в котором будет работать SQLBase и создаваемая прикладная программа. В частности, SQLBase имеет набор функций для профессиональных графических приложений и расширение этих функций для многопользовательского окружения. Этот набор функций включает варианты работы с курсорами прокрутки и результирующими множествами (result set), а также несколько вариантов уровня локализации, или одновременности, выполняемых операции.

Эти функции API и другие функциональные возможности говорят о хорошем наследии SQLBase, а также о ее богатых средствах поддержки для создания графических прикладных программ для PC.

Интерфейс прикладного программирования (SQL/API)

Этот интерфейс доступен для программ на C/C++ на всех основных вариантах Microsoft Windows (3.1, 9х, and NT). Имеется как 16-, так и 32-разрядный интерфейс. Также возможно писать загружаемые модули NetWare с доступом к этому API.

Сервер базы данных предоставляет богатый набор функциональных возможностей, и любую из этих возможностей можно задействовать через полностью документированный API. Все функциональные возможности, обеспечиваемые инструментами SQLBase (такими как, например, SQLConsole), также могут использоваться в прикладных программах.

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

SQL/API в SQLBase - это мощный, всеобъемлющий и доступный интерфейс прикладного программирования.

ODBC

Для разработчиков, которые хотят иметь доступ к SQLBase с помощью интерфейса ODBC, имеются в наличии драйверы как для 16-, так и для 32-разрядной версии. Это дает возможность любому продукту, поддерживающему работу с ODBC (например, Microsoft Excel или Visual Basic), использовать SQLBase как источник данных.

SQLBase++

SQLBase++ является расширением библиотеки базовых классов Microsoft (MFC) и полностью интегрируется в среду разработки Visual C++ (Win16 и Win32). Она дает разработчику возможность объектно-ориентированного программирования вместо использования API-интерфейса стандартного С.

Хотя при объектно-ориентированном программировании ODBC часто используется в связке с MFC, SQLBase++ позволяет, оставаясь в рамках объектно-ориентированного подхода, использовать свойственные SQLBase возможности по улучшению производительности, такие как, например, сцепленные хранимые команды (chained stored commands), чего нельзя добиться с помощью одного стандартного ODBC.

Инструмент SQLWindows and Team Developer

Графические инструментальные 4GL средства разработки приложений компании Gupta SQLWindows и Team Developer, построены на использовании SQLBase SQL/API для взаимодействия с SQLBase. Этот набор инструментов был задуман для того, чтобы функциональные возможности SQLBase для разработки и внедрения графических приложений можно было использовать во всей их полноте.

SQL/API можно также использовать вместе с программами-переходниками от Gupta для того, чтобы подключаться к базам данных других производителей, что дает возможность приложениям SQLWindows и Team Developer использовать общий API-интерфейс для работы как с SQLBase, так и с другими серверами баз данных.

SQLTrace/SQLReplay

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

SQLTrace - это программа, которая работает под Microsoft Windows и позволяет трассировать и отлаживать взаимодействия любого приложения-клиента с SQL/API. Она запускается на машине-клиенте и предоставляет следующие возможности:

Анализ запросов

Для того чтобы создатели прикладных программ могли изучать, что делает оптимизатор запросов, они могут потребовать от SQLBase показать план реальных действий для каждого заданного запроса. Это можно сделать либо через SQL API, либо из SQLTalk.

Эта возможность особенно полезна, если используется вместе с анализатором производительности, о котором речь пойдет ниже. Можно выявить запросы, которые выполняются дольше ожидаемого времени, и, с помощью SQLTalk, выработать план оптимального выполнения программы.

SQLBase выполняет эту работу автоматически, при этом предоставляя необходимые возможности для управления своими действиями.

Построение модели данных

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

Оптимизация для графических приложений

Требования, выдвигаемые графическими приложениями, выходят за рамки стандартных возможностей, которые предоставляет большинство сегодняшних SQL-серверов, сконструированных еще в те времена, когда были в моде приложения, запускаемых из командной строки. Однако SQLBase с самого начала создавался с наличием возможностей, удовлетворяющих нужды графических приложений.

Как будет показано ниже, эти возможности удовлетворяют потребности разработчиков клиент/сервер-приложений как в функциях для работы в автономном режиме, так и для выполнения чистых запросов на выборку. Однако суть архитектуры клиент/сервер - это работа в многопользовательском окружении, но и здесь SQLBase обладает специальными архитектурными возможностями, которые обеспечиваются механизмом контроля версий записей (row versioning) - основой технологии SQLBase, - который как раз для этого был создан.

Сохранение контекста курсора

Для того чтобы достичь наивысшего уровня одновременности транзакций, все приложения базы данных должны как можно быстрее фиксировать (commit) обновления или аннулировать (rollback) их, сводя к минимуму период времени, в который другим пользователям заблокирован доступ к обновляемым данным. В более стандартных SQL СУБД, таких как IBM DB2, фиксация изменений влечет за собой потерю всей информации о контексте для каждого курсора, используемого в приложении. Для восстановления такой потери контекста требуются значительные усилия, как при программировании приложения, так и во время работы базы данных. Обычно в таких случаях приходиться повторно делать извлечение (fetch) большого количества данных, и БД-серверу часто бывает необходимо перекомпилировать сложные команды.

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

Тип данных LONG

SQLBase поддерживает неограниченный размер типа данных LONG (в отличие от многих других баз данных, которые обычно накладывают ограничение в 32Кб на одно поле). Двоичные данные могут храниться в столбце таблицы. Эта возможность очень важна для хранения растровых рисунков, документов текстовых процессоров или цифровой аудиозаписи. Также, в отличие от многих конкурентов, SQLBase не накладывает ограничения на количество столбцов типа LONG на одну таблицу. Кроме того, SQLBase значительно быстрее своих конкурентов и читает, и пишет данные типа LONG.

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

Контроль версий записей (Row Versioning)

Такие возможности SQLBase как прокручиваемые результирующие множества, гибкие уровни локализации (isolation levels) и уведомление об обновлении (update notification) являются во многих отношениях просто аспектами цельного, интегрированного подхода к работе в режиме клиент/сервер и к доступу к базам данных. Ключевым звеном архитектуры является понятие идентификатора записи ROWID. Этот термин используется еще несколькими производителями СУБД, но полностью реализован только в SQLBase.

Данные в SQLBase, также как и в других реляционных СУБД, хранятся в строках. К значениям полей каждой строки добавляется псевдо-поле ROWID, которое поддерживается базой данных. Это псевдо-поле однозначно идентифицирует строку в базе данных, но его изменять может только сама база данных. Оно используется внутри системы для работы с результирующими множествами (см. ниже), а также его могут использовать прикладные программы в качестве ключа для оптимистического блокирования (optimistic locking)1.

Конкретное значение ROWID заключает в себе ряд составляющих - оно записывает не только физическое положение строки в базе данных, но также включает серийный номер, который последовательно увеличивается с каждым изменением данных строки. Это дает следующие преимущества:

Курсоры прокрутки и результирующие множества

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

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

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

Следовательно, SQLBase оптимизирует производительность благодаря:

Все это производится автоматически и прозрачно для пользователя самой SQLBase, и программисты не должны беспокоиться об этом - они просто автоматически получают преимущества от усовершенствованной работы SQLBase с результирующими множествами.

Усовершенствованные уровни локализации

Традиционная пакетная обработка или приложения командной строки подталкивают к тому, чтобы дать пользователю возможность выбрать отдельную запись (как правило, на основе предопределенного критерия), внести изменения в эту запись и/или в связанные с ней записи, зафиксировать транзакцию и продолжать дальше в том же духе. В такой ситуации базе данных свойственно не давать другим пользователям вносить изменения в те данные, которые первый пользователь просматривает в настоящий момент - это известно как "пессимистический" подход к блокировке2. Для тех ситуаций, где такая форма блокировки оправдана, SQLBase поддерживает такой же уровень локализации, который реализован в IBM DB2 Database Manager:

Повторяемость чтения (Read Repeatability -RR)

Этот уровень локализации представляет пользователю предсказуемый вид всех данных, и этот уровень установлен по умолчанию. Данные остаются нетронутыми другими пользователями независимо от того, как часто их читают или обновляют в текущей программе-приложении. SQLBase делает это путем автоматической монопольной блокировки (exclusive lock)3 всех обновляемых данных и немонопольной, с взаимным доступом, блокировки (share lock) всех читаемых данных. Это обеспечивает максимальную согласованность данных, но с ущербом для параллелизма работы пользователей: из-за монопольной и немонопольной блокировок текущему приложению, возможно, придется ожидать завершения работы других приложений, или другим приложениям придется ожидать текущее приложение.

Стабильность курсора (Cursor Stability -CS)

Механизм CS аналогичен блокировке RR за исключением того, что немонопольная блокировка снимается со строки, как только курсор с нее "сместился". CS дает улучшение параллелизма по сравнению с RR, но предсказуемость данных уменьшается, поскольку немонопольная блокировка снимается сразу после перемещения курсора со строки. Пользователь может видеть изменения данных, выполняемые другими пользователями, если данные извлекаются более одного раза.

Хотя эти уровни локализации имеют свои применения, многие приложения (особенно графические) дают возможность просматривать намного большие объемы данных, поиск которых осуществляется непредсказуемым образом по прихоти пользователя и которые остаются "открытыми" для сопоставления и интерпретации. Такое использование данных усугубляет конфликты, вызываемые многопользовательским доступом и свойственные традиционным моделям блокировки. Другие производители СУБД пытались улучшить параллелизм в рамках пессимистической модели, просто уменьшая количество заблокированных данных. Этот подход реально не решает проблему, поскольку конфликты все же могут происходить. Более того, это вызывает существенную лишнюю нагрузку, и, как следствие, может снизить производительность.

SQLBase решает эти проблемы, обеспечивая механизм "оптимистической" блокировки.

Освобождаемая блокировка (Release Lock - RL)

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

Наконец, тем частям приложениям, которым требуется просматривать большие количества данных и которым надо сохранять предсказуемость данных на время операции, но не надо совершать обновлений (как при пакетном создании больших отчетов), SQLBase предоставляет уровень локализации "только чтение" (Read Only).

Только чтение (Read Only - RO) - Возможность отсутствия блокировки для предсказуемых запросов

Этот уровень гарантирует, что курсору чистого запроса на выборку данных не придется ждать другие приложения и что никакое другое приложение, обновляющие данные, не будет ждать приложение, которое только извлекает данные. Таким образом, взаимные блокировки (deadlocks) полностью исключаются.

Уведомление об обновлениях и защита обновлений

Графические приложения обычно отображают значительное количество данных, извлеченных из базы, и дают пользователям возможность осуществлять изменения малого подмножества этих данных. В этом случае уровень блокировки RL доводит до максимума параллелизм, но в многопользовательском окружении может возникать проблема "потери результатов обновления", если приложение не выявляет ведущую к этому ситуацию. К счастью, SQLBase предоставляет надежное и простое решение, основанное на идентификаторе ROWID и называемое механизмом уведомления об обновлении (Update Notification).

Если пользователь решает обновить какую-то строку, приложение может использовать ее ROWID, чтобы указать SQLBase, какую именно строку обновлять, путем включения ROWID в инструкцию WHERE. Это не только является исключительно быстрым действием, но, кроме того, когда обновление строки было произведено после ее последнего извлечения данным пользователем, SQLBase уведомит приложение о том, что было произведено такое обновление и не даст приложению выполнить обновление такой строки от имени этого пользователя. SQLBase также укажет приложению, была ли строка изменена или же удалена другим пользователем.


1 ptimistic locking - "оптимистическое блокирование" (стратегия блокирования набора данных, при которой страница, содержащая изменяемую запись, блокируется только на время внесения изменений в запись программой, но не пользователем).
2 pessimistic locking - "пессимистическое блокирование" (стратегия блокирования набора данных, при которой страница, содержащая изменяемую запись, блокируется на все время внесения изменений в запись пользователем и не доступна для редактирования другим пользователям).
3 exclusive lock - блокировка (для обеспечения) взаимоисключающего доступа (напр. к набору данных), блокировка с монополизацией.

Дополнительная информация

Дополнительную информацию Вы можете получить в компании Interface Ltd.

Обсудить на форуме
Отправить ссылку на страницу по e-mail


Interface Ltd.
Тel/Fax: +7(095) 105-0049 (многоканальный)
Отправить E-Mail
http://www.interface.ru
Ваши замечания и предложения отправляйте автору
По техническим вопросам обращайтесь к вебмастеру
Документ опубликован: 28.06.02