05 СУБД в архитектуре клиент-сервер.ppt
- Количество слайдов: 22
СУБД в архитектуре «клиент-сервер» File Server Remote Data Access Database Server Application Server
СУБД в архитектуре «клиент-сервер» Группы функций программной системы: n n n Функции отображения и ввода данных Уровень представления, Presentation Layer, Prez. Layer Прикладные функции – логика предметной области Уровень бизнес- логики, Business Layer, Biz. Layer Функции доступа к базам данных Уровень данных, Database Layer, Data. Layer
Модель «Файловый сервер» (File Server) Достоинства: n Использование единых ресурсов сервера (больших НМД) Недостатки: n Низкая защищенность (уровень файловой системы)
Модель удаленного доступа к данным (Remote Data Access) Достоинства: n Повышенная защищенность данных n Возможность управления транзакциями Недостатки: n Высокий сетевой трафик n Сложность координации многопользовательских приложений
Модель сервера баз данных (Database Server) Основные черты: n БД соответствует предметной области (концептуальная модель) n БД активна – реагирует на изменения данных n Имеет средства ограничения доступа к данным n Имеет средства восстановления данных Основа – хранимые процедуры и триггеры
Модель сервера баз данных (Database Server) Достоинства: n Уменьшение сетевой нагрузки n Уменьшение дублирования кода Недостатки: n Высокая загрузка сервера (BL, DL, СУБД) n Сложность разработки, если бизнес-логика частично реализуется на клиенте
Модель сервера приложений (Application Server) Трехуровневая архитектура «клиент-сервер» n Клиент – уровень представления n Бизнес логика – на отдельном сервере n СУБД – на отдельном сервере
Модель сервера приложений (Application Server) Достоинства: n «Тонкий клиент» - менее дорогая аппаратура n Централизация бизнес-логики – централизация сопровождения (поддержка, замена оборудования, администрирование) n Модульность – простая модификация и замена ПО n Возможность равномерного распределения нагрузки Недостатки: n Сложность реализации
Модель сервера приложений (Application Server) Web-приложение
Модель сервера Web-приложений (Application Server) Достоинства: n Простота реализации HTML n Независимость браузеров от платформы n Высокий уровень стандартизации уровня представления (HTML) n Масштабируемость – доступ с произвольного клиента, нет необходимости разворачивать на клиенте сложное ПО Недостатки: n Низкая надежность из-за ненадежности глобальной сети n Слабая защищенность данных, передаваемых между клиентом и сервером приложения n Отсутствие контроля масштабируемости (неожиданно высокая нагрузка на сервер) n Ограниченная функциональность HTML
Знакомство с DLL – динамически связываемая библиотека p. cpp #include<odbc. h> y = get(5) после трансляции p. obj odbc. h int get(int x) odbc. lib имя: get адрес: 1108 после загрузки в память p. exe единый процесс odbc. dll
ODBC – Open Database Connectivity открытая система связи с базами данных Приложение ODBC API Менеджер драйверов ODBC API Драйвер источники данных Драйвер
ODBC • • • Задачи, выполняемые приложением: выбор источника данных предоставление SQL операторов на выполнение получение результата обработка ошибок запрос на выполнение фиксации или отката транзакции отсоединение от источника данных Задачи, выполняемые Менеджером драйверов: предоставляет стандартный интерфейс вызывает функции драйвера по указателю поддерживает список источников данных подгружает и выгружает не нужные драйверы проверяет часть ошибок Задачи, выполняемые Драйвером: • подсоединяется к источнику данных • выявляет ошибки • преобразует SQL операторы в запросы, специфические для источника данных • передает данные и выполняет преобразование типов
ODBC
ODBC
ODBC Дескрипторы и объекты Приложение ODBC. DLL Преобразование дескриптора в адрес h. Env Информация о среде выполнения h. Dbc h. Stmt Информация о соединении Информация о команде
ODBC 1. Соединение с СУБД SQLAlloc. Env(&h. Env) SQLAlloc. Connect(h. Env, &h. Dbc) SQLDriver. Connect(h. Dbc, …) SQLAlloc. Stmt(h. Dbc, &hstmt) 2. Выполнение запроса SQLExec. Direct(hstmt, command, …) SQL запрос к СУБД 3. Получить результат запроса SQLBind. Col(hstmt, 1, …) привязка колонок к переменным SQLFetch(hstmt) перемещение курсора 4. Отсоединение от СУБД SQLDisconnect(h. Dbc) SQLFree. Connect(h. Dbc) SQLFree. Env(h. Env)
ODBC #include "stdafx. h" #include<iostream> #undef UNICODE #include <windows. h> #include <odbcinst. h> #include <sqlext. h> #include <ctype. h> #include <string> #include <iostream> using namespace std; SQLCHAR connection. String. DSN[256] = "DSN=North. Wind. Connection; UID=norcal; PWD=norcal; "; SQLCHAR connection. String. Driver[256] = "DRIVER={SQL Server}; SERVER=LENA\SQLEXPRESS; " "UID=norcal; PWD=norcal; DATABASE=Northwind; "; void error. Message(const char* s) { cout<< "*** Error *** " << s << endl; } void Message(const char* s) { cout << s << endl; }
ODBC void Do. Select(SQLCHAR connection. String[256]) { HENV h. Env; HDBC h. Dbc; HSTMT h. Stmt = SQL_NULL_HSTMT; RETCODE rc; SQLSMALLINT cb. Out. Con. Str = 0; // Получить соединение с СУБД SQLCHAR out. Connection. String[256]; SQLAlloc. Env(&h. Env); SQLAlloc. Connect(h. Env, &h. Dbc); rc = SQLDriver. Connect(h. Dbc, NULL, connection. String, SQL_NTS, out. Connection. String, sizeof(out. Connection. String), &cb. Out. Con. Str, SQL_DRIVER_COMPLETE); //SQL_DRIVER_NOPROMPT SQL_DRIVER_COMPLETE if(!(rc == SQL_SUCCESS) && !(rc == SQL_SUCCESS_WITH_INFO)) { error. Message("Error SQLDriver. Connect"); return; }
ODBC SQLHSTMT hstmt; rc = SQLAlloc. Stmt(h. Dbc, &hstmt); SQLCHAR command[256] = "SELECT Employee. Id, Address FROM Employees"; rc = SQLExec. Direct(hstmt, command, SQL_NTS); SQLINTEGER Employee. Id; SQLCHAR Address[60]; SQLINTEGER cb. Employee. Id, cb. Address; if (rc == SQL_SUCCESS || rc == SQL_SUCCESS_WITH_INFO) { SQLBind. Col(hstmt, 1, SQL_C_ULONG, &Employee. Id, 0, &cb. Employee. Id); SQLBind. Col(hstmt, 2, SQL_C_CHAR, Address, 60, &cb. Address); while (TRUE) { rc = SQLFetch(hstmt); if (rc == SQL_ERROR) { error. Message("Error in the fetch"); } if (rc == SQL_SUCCESS || rc == SQL_SUCCESS_WITH_INFO) { cout << Employee. Id << " " << Address << endl; } else { break; } } SQLDisconnect(h. Dbc); SQLFree. Connect(h. Dbc); SQLFree. Env(h. Env); } else error. Message("Exec SQL error"); }
ODBC void List. DSN() { const short SQL_MAX_DSN_LENGTH_ = SQL_MAX_DSN_LENGTH; UCHAR sz. DSN[SQL_MAX_DSN_LENGTH+1]; UCHAR sz. Description[256]; short w. DSNLen; SQLSMALLINT w. Des. Len; int ret. Code; SQLHENV h. Env = NULL; string DSNName; string result. String; string Descr; SQLAlloc. Env(&h. Env); ret. Code = SQLData. Sources(h. Env, SQL_FETCH_FIRST, sz. DSN, SQL_MAX_DSN_LENGTH_+1, &w. DSNLen, sz. Description, 256, &w. Des. Len); while(ret. Code == SQL_SUCCESS || ret. Code == SQL_SUCCESS_WITH_INFO) { DSNName = (string)((char *) sz. DSN); Descr = (string)((char *) sz. Description); result. String += DSNName; result. String += "n"; ret. Code = SQLData. Sources(h. Env, SQL_FETCH_NEXT, sz. DSN, SQL_MAX_DSN_LENGTH_+1, &w. DSNLen, sz. Description, 256, &w. Des. Len); } SQLFree. Env(h. Env); Message(result. String. c_str()); }
ODBC void Show. Menu() { int choice = 0; bool done = false; do { cout << "n*** MENU ***" << endl; cout << "0 - exit" << endl; cout << "1 - list all DNS" << endl; cout << "2 - select (using DNS)" << endl; cout << "3 - select (using driver directly)" << endl; cout << "Choice : "; cin >> choice; switch(choice) { default : done = true; break; case 1 : List. DSN(); break; case 2 : Do. Select(connection. String. DSN); break; case 3 : Do. Select(connection. String. Driver); break; } }while(!done); } int main(int count, char* cparams[]) { Show. Menu(); return 0; }
05 СУБД в архитектуре клиент-сервер.ppt