Поделиться через


Учитывая возможности базы данных, которые следует использовать

После того как базовый уровень взаимодействия известен, необходимо учитывать функции базы данных, используемые приложением. Например, какие инструкции SQL будут выполняться приложением? Будет ли приложение использовать прокручиваемые курсоры? Операций? Процедуры? Длинные данные? Сведения о возможностях, которые могут не поддерживаться всеми СУБД, см. в описаниях функций SQLGetInfo, SQLSetConnectAttr и SQLSetStmtAttr и приложении C: грамматика SQL. Функции, необходимые приложению, могут исключить некоторые СУБД из списка целевых СУБД. Они также могут показать, что приложение может легко нацеливаться на многие СУБД.

Например, если необходимые функции просты, они обычно могут быть реализованы с высокой степенью взаимодействия. Приложение, выполняющее простую инструкцию SELECT и извлекающее результаты с помощью курсора с прямой передачей, вероятно, будет высоко совместимым благодаря своей простоте: почти все драйверы и СУБД поддерживают нужную функциональность.

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

  • Более низкая совместимость, дополнительные возможности. Приложение включает функции, но работает только с СУБД, поддерживающими их.

  • Более высокий уровень взаимодействия, меньше возможностей. Приложение удаляет функции, но работает с дополнительными СУБД.

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

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

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

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

Приложение имеет ряд вариантов на основе того, что драйвер возвращает для параметра SQL_MAX_CONCURRENT_ACTIVITIES в SQLGetInfo:

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

  • Никогда не поддерживает несколько запросов. Приложение полностью удаляет функцию. Легко реализовать и обеспечить высокую совместимость, но имеет меньшие функциональные возможности.

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

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