![]() |
|
сделать стартовой | добавить в избранное |
![]() |
Компьютеры, Программирование
Программное обеспечение
Менеджер подключений к базам данных |
Андрей Майоров Введение Не будет большим преувеличением сказать, что львиная доля разрабатываемых сейчас программ использует в своей работе базы данных. Большинство из них работает с одной базой, более редкие представители – с двумя, тремя, четырьмя и так далее, вплоть до полной неопределенности в количестве баз на этапе разработки. Примеры приложений, работающих с одной БД, знакомы каждому. С двумя базами может работать, например, программа, синхронизирующая данные между ними. При этом базы могут иметь разную структуру и управляться разными СУБД. С заранее неизвестным количеством баз может работать, например, приложение, собирающее статистику из множества источников. В рамках этой статьи нас не очень интересует, что именно приложение делает с базой данных. Важен сам факт подключения для выполнения каких бы то ни было операций. Рассмотрим традиционный для ADO. E сценарий работы с базой. Во-первых, мы должны знать строку подключения (co ec io s ri g), во-вторых, создать объект подключения соответствующего типа, затем проинициализировать его этой строкой, открыть и начать использовать. По завершению использования объект подключения следует уничтожить. Выглядит это примерно так: s ri g co S ri g = "."; SqlCo ec io co = ew SqlCo ec io (); co .Co ec io S ri g = co S ri g; usi g( co ){ co .Ope (); . } // В этой точке подключение будет автоматически закрыто и уничтожено Код прост и логичен, но в реальном приложении с ним могут возникнуть проблемы: Почти всегда разработка приложения ведется не с теми строками подключения, которые будут использоваться при эксплуатации. Соответственно, мы не можем жестко зашить строку подключения в код, а должны как-то ввести ее во время работы приложения. В ряде приложений разработчик не знает конкретного типа объекта подключения и работает с базовым интерфейсом IDbCo ec io . Для таких случаев код типа « ew SqlCo ec io » не годится. В то же время разработчик обычно четко представляет, какое подключение ему нужно открыть, и может логически обозначить его «база А» или «база Б», что бы это ни означало в среде конечного пользователя. В случае приложения с одной базой, можно подключаться и к некоторой базе по умолчанию, никак ее не именуя. Очевидно, что удобным решением могло бы стать использование некоторого механизма, позволяющего получать объект подключения к базе данных по его логическому имени. Конечному пользователю этот механизм должен предоставлять возможность быстро и просто ассоциировать логическое название с реальной строкой подключения. Например, это можно делать в файле конфигурации. Подобный механизм мы и назовем «менеджером подключений к базам данных». Основная функция менеджера Основная функция менеджера – по заданному логическому имени вернуть объект подключения нужного типа, проинициализированный нужной строкой подключения. В использовании это может выглядеть так: SqlCo ec io c1 = (SqlCo ec io )dbmgr; IDbCo ec io c2 = dbmgr.Defaul ; Приведение типа в первой строке обусловлено тем, что наше приложение может работать с базами разных типов, и, следовательно, менеджер не может возвращать объект подключения какого-то определенного типа.
Так как любой объект подключения должен реализовывать интерфейс IDbCo ec io , менеджеру наиболее логично давать доступ к объектам именно через этот интерфейс. Очевидно, что эта функция менеджера примерно соответствует шаблону (паттерну) проектирования Fac ory Me hod. Перечисление подключений Мы уже говорили о приложениях с неопределенным на этапе разработки количеством подключений. В практике применения менеджера подключений это может выглядеть, например, так: программа должна последовательно получить информацию из каждой БД, зарегистрированной в менеджере. При этом на момент написания программы мы не знаем, какие базы, и в каком количестве будут нужны конечному пользователю. Очевидно, что в этом случае логические имена баз нас не очень-то интересуют. Гораздо больше нам нужна возможность перебора всех баз в менеджере. Например: foreach( IDbCo ec io co i dbmgr ) { // Получаем информацию } Для того чтобы эта языковая конструкция работала, да и вообще для перебора всех имеющихся подключений, наш класс DbMa ager должен реализовывать интерфейс IE umerable. Конфигурирование менеджера Настройка менеджера заключается в установке соответствия между логическим именем подключения и информацией, достаточной для создания объекта подключения. Несложные размышления показывают, что достаточно знать тип объекта подключения, строку подключения, а также является ли данное подключение подключением по умолчанию. Как уже указывалось, проще всего эту настройку делать через конфигурационный файл приложения. При этом и у разработчика есть единое место для описания подключений, и конечный пользователь может быстро адаптировать приложение к своим условиям. Нужно отметить, впрочем, что при этом подходе конечный пользователь должен знать стандартный формат строк подключения ADO. E . Примерный код, инструктирующий менеджера произвести чтение настроечных данных, даже если он уже был сконфигурирован: dbmgr.Co figure( rue ); // forceReload = rue При этом формат секции конфигурационного файла может быть таким: &l ;Da abase> &l ;co ec io ame="alfa" co ec io S ri g="." defaul =" rue" /> &l ;co ec io ame="be a" co ec io S ri g="." ype="OleDbCo ec io " /> &l ;/Da abase> Здесь декларируется, что приложение использует две базы данных. Первая из них называется alfa, обслуживается объектом типа SqlCo ec io (ибо ничего другого не указано), и является подключением по умолчанию. Вторая носит логическое имя be a и обслуживается объектом типа OleDbCo ec io . Безусловно, для обеих баз указаны и корректные строки подключений. Имея простой и удобный способ описания подключений через конфигурационный файл, мы, тем не менее, не должны забывать, что бывают ситуации, когда все это должно быть сделано программным путем. Например, так: Co figura io co fig = ew Co figura io (); // Настраиваем объект co fig // Назначаем конфигурацию менеджеру DbMa ager.Co figure( co fig ); В данном случае объект типа Co figura io предоставляет нам те же возможности настройки, что и файл конфигурации. Очень тяжело представить приложение, в котором существовало бы несколько отдельных наборов подключений к базам данных.
Я говорю, например, о ситуации, когда в двух разных местах приложения мы используем два разных подключения с именем be a. Какие выводы из этого следуют? Во-первых, это значит, что все экземпляры менеджера подключений, используемые в приложении, должны быть сконфигурированы одинаково. Соответственно, методы Co figure( ) мы смело можем делать статическими. Во-вторых, напрашивается вывод, что мы вполне можем обойтись одним экземпляром менеджера на все приложение. В некоторых случаях, о которых мы поговорим позже, нам понадобится большее, но все же ограниченное количество экземпляров. Из этого следует, что экземпляр менеджера мы должны получать не при помощи оператора ew, а посредством некоего статического метода класса. Пример: DbMa ager dbmgr = DbMa ager.Ge (); Подобный подход напоминает о паттерне проектирования Si gle o , но, в отличие от классической трактовки, у нас может быть не один экземпляр, а несколько. Впрочем, об этом мы еще поговорим. Структура класса Продумав сценарий использования менеджера, мы можем спроектировать структуру класса. Вот она: public class DbMa ager : IE umerable { public s a ic DbMa ager Ge () {.} public IDbCo ec io his { ge {.} } public IDbCo ec io Defaul { ge {.} } public s a ic void Co figure( bool forceReload ) {.} public s a ic void Co figure( Co figura io co fig ) {.} public IE umera or Ge E umera or() {.} // Непубличные методы и члены класса . } Краткое описание методов: Ge – возвращает менеджер подключений. Если экземпляра менеджера еще нет, создается новый. his – возвращает объект подключения по данному логическому имени. В том случае, если имя не указано (равно ull), возвращается объект подключения по умолчанию. Defaul – возвращает объект подключения по умолчанию. Co figure( bool ) – читает настроечную информацию из конфигурационного файла. Если мы пытаемся работать с еще не сконфигурированным менеджером, он должен автоматически вызвать этот метод. Co figure( Co figura io ) – настраивает менеджер в соответствии с данным конфигурационным объектом. Ge E umera or – позволяет пробежаться по всем подключениям менеджера циклом foreach. Варианты работы с базой Мы уже рассматривали кусок типового кода, работающего с базой. Более полный фрагмент выглядит так: мы сначала создаем подключение (например, SqlCo ec io ), потом создаем команду (SqlComma d), добавляем к команде параметры, ассоциируем ее с подключением, открываем подключение, выполняем команду, закрываем подключение: SqlCo ec io co = ew SqlCo ec io (); co .Co ec io S ri g = "."; SqlComma d cmd = ew SqlComma d(); cmd.Comma d ex = "."; cmd.Co ec io = co ; cmd.Parame ers.Add( ew SqlParame er( . ) ); usi g( co ){ co .Ope (); cmd.Execu e(); . } Мы делаем это при каждом обращении к базе, так что возникает вопрос: а не будет ли быстрее заранее создать и сохранить подключение и команду, а потом только использовать их? С точки зрения элементарной логики кажется очевидным, что должно быть быстрее. С другой стороны, известно, что создание объектов в . E Framework происходит очень быстро, так что выигрыш вряд ли будет большим.
Раньше менеджерам Microsoft приходилось тратить больше времени на бумажное оформление таких отчетов, чем на обдумывание их содержания. Специальная программа составления оценок эффективности работы сотрудников упрощает работу менеджеров и одновременно гарантирует следование стратегическим принципам компании. Программа рассчитывает стандартный показатель повышения квалификации каждого сотрудника и размер его премии, опираясь на указанный Шарон рейтинг, уровень должности сотрудника и его текущий оклад. Возможно изменение таких автоматически рассчитанных значений (например, за действительно выдающиеся достижения можно поднять сотруднику «до упора» и оклад, и премию), но менеджеры при этом должны следовать установленным в компании общим процентным нормативам. Когда Шарон вводит рейтинги для каждого сотрудника, программа автоматически вычисляет новое групповое среднее значение. Если оно оказывается слишком большим или слишком малым, Шарон может вернуться на предыдущий этап и изменить цифры. После того как вышестоящие менеджеры поставят электронную визу на подготовленные Шарон предложения, все изменения премиальных выплат будут автоматически направлены программой в соответствующие записи главной базы данных отдела кадров и в системы учета фондовых опционов
2. Форматы баз данных в автоматизированных библиографических системах
3. Различные классы баз данных по предметным областям использования
4. База данных для учета оплаты за междугородние разговоры
5. Разработка базы данных `ДЕКАНАТ` в среде программирования "Delphi"
9. Базы данных Microsoft Access
10. Разработка базы данных "Культурный досуг"
11. Системы управления базами данных
12. Алгоритм создания базы данных складского учета
13. Разработка базы данных для объекта автоматизации: гомеопатическая аптека
14. Отчёт по созданию курсовой работы «База данных ACCESS»
15. Инструкция по эксплуатации базы данных магазина «Телевизоры» средствами Access 2000
16. Системы обработки информации - язык баз данных SQL со средствами поддержания целостности
19. База данных периодического издания
21. База данных
25. Ответы на теоретические вопросы по предмету База данных
26. Инфологическая модель баз данных "Сущность-связь"
27. Пример проектирования базы данных "Библиотека"
28. Основы использования WWW - технологий для доступа к существующим базам данных
29. Основы работы с базами данных Delphi
30. Параллельные машины баз данных
31. Инфологическое моделирование базы данных
33. Web-серверы, базы данных в Интернет, Поиск информации в Интернет, Основные системы и средства
34. База данных для информационной системы - Таксопарк
35. Защита баз данных. Access 2000
36. Курсовая работа по базе данных СУБД
37. Организация Web-доступа к базам данных с использованием SQL-запросов
41. Реляционные базы данных-правила формирования отношений
42. Создание базы данных в интегральном пакете Works
43. Создание учебной базы данных Телефонный справочник в Access 97
44. Учет очереди на получение квартир по организациям (база данных)
45. Создание базы данных в Access и работа с ней
46. Реляционные модели базы данных
47. Система баз данных MS Access
49. Информационно-справочная система, обеспечивающая работу с базой данных Bit
50. Реляционные Базы Данных. SQL - стандартный язык реляционных баз данных
52. Создание базы данных «расписание»
53. Проектирование Базы Данных для коммерческого предприятия
57. Лінгвістична база даних українських художніх порівнянь
58. База даних "Кафедра" в Access з меню MDI
59. База даних клієнтів і замовлень
60. База даних по обліку вогнепальної зброї
61. База даних по приватних підприємствах регіону
62. База даних фільмотеки: розробка проекту
63. База данных
64. База данных "Автосервис" в среде Borland Delphi 6.0.
66. База данных "Пассажирские железнодорожные перевозки"
68. База данных "Учет готовой продукции на складе"
73. База данных заместителя директора по воспитательной работе приюта г. Аксу
74. База данных компьютерного магазина
75. База данных по учету металлопродукции на платформе SQL Server
77. База данных станции технического обслуживания автомобилей
78. База данных: "Деканат: дистанционное обучение"
79. Базы данных
80. Базы данных
81. Базы данных в юриспруденции
82. Базы данных и их функции. Структурные элементы базы данных
83. Базы данных на логическоми и функциональном программировании
84. Инфологическая модель базы данных "Видепрокат"
85. Инфологическая модель базы данных "Паспортный учет"
89. Історія розвитку баз даних
90. ЛИСП-реализация основных операций над базами данных
91. Методология проектирования баз данных
92. Настольные системы управления базами данных
96. Построение базы данных боксерской организации
97. Программирование. База данных "Клиенты"