|
Программирование >> Oracle
чение ключа. Проблема осложняется тем, что реальные транзакции намного больше транзакции, показанной выше. Показанные в примере операторы UPDATE и SELECT - лишь два из множества операторов, входящих в транзакцию. Необходимо еще вставить в таблицу строку с только что сгенерированным ключом и выполнить необходимые действия для завершения транзакции. Это упорядочение доступа будет огромным ограничивающим фактором для масштабирования. Подумайте о последствиях, если этот метод применить для генерации номеров заказов в приложении для обработки заказов на Web-сайте. Одновременная работа нескольких пользователей станет невозможной, - заказы будут обрабатываться последовательно. Правильное решение этой проблемы состоит в использовании для каждой СУБД соответствующего кода. В Oracle (предполагается, что уникальный ключ необходимо генерировать для таблицы Т) лучшим способом будет: create table t (pk number primary key, ...) ; create sequence t seq; create trigger t trigger before insert on t for each row begin select t seq.nextval into :new.pk from dual; end; В результате каждая вставляемая строка автоматически и незаметно для приложения получит уникальный ключ. Тот же эффект можно получить и в других СУБД с помощью их типов данных - синтаксис оператора создания таблицы изменится, а результат будет тем же. Мы использовали второй вариант - специфические средства каждой СУБД для неблокируемой, высокопараллельной генерации уникального ключа, что, однако, не потребовало реальных изменений в коде приложения - все необходимые действия выполнены операторами ЯОД. Приведу еще один пример безопасного программирования, обеспечивающего переносимость. Если понятно, что каждая СУБД реализует одни и те же возможности по-разному, можно при необходимости создать дополнительный уровень доступа к базе данных. Предположим, вы программируете с использованием интерфейса JDBC. Если используются только простые операторы SQL, SELECT, INSERT, UPDATE и DELETE, дополнительный уровень абстракции скорее всего не нужен. Можно включать код SQL непосредственно в приложение, если использовать конструкции, поддерживаемые во всех СУБД, с которыми должно работать приложение. Другой подход, одновременно упрощающий перенос и повышающий производительность, состоит в использовании хранимых процедур, возвращающих результирующие множества. Если разобраться, окажется, что все СУБД могут возвращать результирующие множества из хранимых процедур, но способы при этом используются абсолютно разные. Для каждой СУБД придется написать свой исходный код. Теперь появляется выбор - либо не использовать хранимые процедуры, возвращающие результирующие множества, либо писать отдельный исходный код для каждой СУБД. Я, несомненно, выбрал бы метод отдельный код для каждой СУБД и активно использовал бы хранимые процедуры. Казалось бы, что при этом для перехода на другую СУБД потребуется больше времени. Однако оказывается, что этот подход упрощает создание приложений, переносимых на различные СУБД. Вместо поисков идеально- го кода SQL, работающего во всех СУБД (причем, как правило, в одних лучше, а в других - хуже), используется код SQL, максимально эффективный в конкретной СУБД. Ею можно вынести из приложения, что дает дополнительные возможности настройки. Можно исправить запрос с низкой производительностью непосредственно в СУБД, и это изменение будет немедленно учтено, без исправлений в приложении. Кроме того, применяя этот метод, можно свободно и в полном объеме использовать преимущества предлагаемых производителем СУБД расширений языка SQL. Например, СУБД Oracle поддерживает иерархические запросы с помощью конструкции CONNECT BY в операторах SQL. Эта уникальная возможность очень поможет при создании рекурсивных запросов. В Oracle вы свободно сможете использовать это расширение SQL, поскольку оно - вне приложения (скрыто в базе данных). В других СУБД для достижения аналогичных результатов, возможно, придется использовать временные таблицы и хранимые процедуры. Вы заплатили за эти возможности, так почему же их не использовать. Такие же методы используют разработчики, создавая код, предназначенный для работы на множестве платформ. Корпорация Oracle, например, применяет описанную выше методику при разработке СУБД. Есть большой фрагмент кода (составляющий, однако, небольшую часть всего кода СУБД), который называется OSD-код (Operating System Dependent) и создается отдельно для каждой платформы. С помощью этого уровня абстракции в СУБД Oracle можно использовать специфические возможности ОС для обеспечения высокой производительности и интегрирования, не переписывая при этом код самой СУБД. Именно благодаря этому СУБД Oracle может работать как многопотоковое приложение в Windows и как многопроцессное - в UNIX. Механизмы межпроцессного взаимодействия абстрагированы до такого уровня, что могут воплощаться по-разному для каждой ОС; при этом обеспечивается такая же производительность, как и в приложениях, написанных специально для данной платформы. Помимо синтаксических различий в языке SQL, различаются реализации операторов, различной будет и производительность выполнения одного и того же запроса, есть проблемы управления одновременным доступом, уровней изолированности транзакций, согласованности запросов и т.д. Все это более детально будет рассмотрено в главах 3 и 4, - мы увидим, как сказываются эти различия. В стандарте SQL92 попытались дать четкие определения того, как должна выполняться транзакция, как должны обеспечиваться уровни изолированности, но в конечном итоге в разных СУБД результаты получаются различными. Все это связано с реализацией. В одной СУБД приложение будет вызывать взаимные блокировки и заблокирует все, что можно. В другой СУБД это же приложение не вызывает никаких проблем и работает отлично. В одной СУБД блокирование (физически упорядочивающее обращения) намеренно использовалось в приложении, а при его переносе в другую СУБД, где блокирования нет, получается неверный ответ. Чтобы перенести готовое приложение в другую СУБД, требуется много труда и усилий, даже если при первоначальной разработке неукоснительно соблюдался стандарт. Возможности и функции Противники обязательного обеспечения независимости от СУБД приводят следующий аргумент: нужно хорошо понимать, что именно предлагает конкретная СУБД, и полностью использовать ее возможности. В этом разделе не описываются все уникаль- ные возможности Oracle 8i, - для этого понадобилась бы отдельная большая книга. Новым возможностям СУБД Oracle 8i посвящена специальная книга в наборе документации по СУБД Oracle. Если учесть, что вместе с СУБД Oracle поставляется документация общим объемом около 10 000 страниц, детальное рассмотрение каждой возможности и функции практически нереально. В этом разделе просто показано, почему даже поверхностное представление об имеющихся возможностях дает огромные преимущества. Как уже б]ло сказано, я отвечаю на вопросы о СУБД Oracle на Web-сайте. Если честно, процентов 80 моих ответов - ссылки (URL) на документацию. Меня спрашивают, как реализовать те или иные сложные функциональные возможности в базе данных (или вне ее). А я просто даю сс]лку на соответствующее место в документации, где написано, как это уже реализовано в СУБД Oracle и как этими возможностями пользоваться. Часто такие случаи бывают с репликацией. Я получаю вопрос: Хотелось бы сохранять копию данных в другом месте. Эта копия должна быть доступна только для чтения. Обновление должно выполняться раз в сутки, в полночь. Как написать соответствующий код? . Ответ простой: см. описание оператора CREATE SNAPSHOT. Вот что такое встроенные возможности СУБД. Можно, конечно, для интереса написать собственный механизм репликации, но это будет не самое разумное действие. СУБД делает многое и, как правило, лучше, чем создаваемые нами приложения. Репликация, например, встроена в ядро, написанное на языке С. Она работает быстро, сравнительно проста в использовании и надежна. Работает в разных версиях, на разных платформах. При возникновении проблем служба поддержки Oracle поможет их решить. После обновления версии репликация будет поддерживаться с новыми, дополнительными возможностями. Теперь предположим, что вы разработали собственный механизм репликации. Вам придется заняться его поддержкой во всех версиях СУБД, которые вы собираетесь поддерживать. Одинаковое функционирование в версии 7.3, 8.0, 8.1 и 9.0 и так далее вы должны будете обеспечивать сами. Если произойдет сбой, обращаться будет не к кому. По крайней мере, пока не удастся получить маленький тестовый пример, демонстрирующий основную проблему. При выходе новой версии вам придется самостоятельно переносить в нее код механизма репликации. Недостаточное понимание того, что предлагает СУБД, может серьезно помешать в будущем. Недавно разработчики демонстрировали мне созданное ими очень нужное программное обеспечение. Это была система обмена сообщениями, решавшая проблему очередей в базе данных. Она обычно возникает при необходимости использования таблицы несколькими сеансами в качестве очереди . Необходимо, чтобы несколько пользователей могли заблокировать очередную запись, пропустив все уже заблокированные записи (они уже обрабатываются). Проблема в том, что нет задокументированной возможности СУБД для пропуска заблокированных строк. Поэтому, не зная о существовании средств, предоставляемых СУБД Oracle, можно приняться за реализацию поддержки очередей самостоятельно (или приобрести готовое решение). Именно это и сделала упомянутая группа разработчиков. Они создали набор процессов и придумали функциональный интерфейс для организации очередей сообщений в СУБД. Они потратили на это немало времени и сил и были уверены, что сделали нечто
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |