Базовые объектные архитектуры распределенных систем. Технологии .NET, (D)COM+, CORBA, EJB
Объектная архитектура распределенных систем. Общие черты технологий CORBA и (D)COM(+)
- Предназначены для разработки сложных распределенных систем.
- Независимость от физического размещения объектов.
- Независимость от платформы (ОС).
- Независимость от языка программирования.
- COM и CORBA реализованы на базе абстрактного интерфейса, то есть языка, который реализует доступ к узлу.
- Объекты взаимодействуют друг с другом с помощью вызовов удаленных процедур (RPC, remote procedure call).
- Используются объекты, расположенные в адресных пространствах клиента и сервера и обменивающиеся данными между собой.
- Клиент и сервер взаимодействуют между собой с помощью marshalling, представляющего собой обмен данными (передаваемые данные упаковываются в так называемый marshalling packet и распаковываются после передачи в другое адресное пространство) и передачу указателей на интерфейсы и аргументы функций между этими объектами.
Объектные модели CORBA и COM. Основные различия
- Тип объектов CORBA - типы его интерфейсов. В COM объект - это экземпляр класса. Базовый тип CORBA - CORBA::Object. Базовый тип COM - IUnknown.
- CORBA поддерживает множественное наследование. Один объект может иметь несколько интерфейсов. В COM каждый объект может иметь один интерфейс. В COM+ введено множественное наследование.
- В CORBA используется идентификация, в COM нет явной идентификации.
- В CORBA активация, сохранение и деактивация осуществляются неявно. В COM эти операции нужно выполнять явно.
- Язык описания интерфейса. В CORBA используется IDL (Interface Definition Language, язык описания интерфейсов). IDL - языковая среда без детальной реализации, напоминает C++, является компилируемым языком, поддерживает связь по данным с Delphi, Ada, Java, C++, Cobol и так далее. IDL базируется на динамических вызовах удаленных процедур. В COM используется MIDL (Microsoft IDL). Язык MIDL привязан к платформе, является компилируемым языком, осуществляет поддержку связей c MJava, Visual C / C++, VB, используется в DLL.
- Отличаются структурой внутренних объектов (служб). CORBA: жизненный цикл, сохранение, контроль за доступом, защита, служба коллекции, импорт, экспорт, программируемые транзакции. COM: жизненный цикл, защита, информация о типах, передача данных, регистрация, асинхронное взаимодействие, битые пакеты не анализируются. СОМ-объекты можно создавать прямым вызовом специальных функций, но напрямую уничтожить его невозможно. Вместо прямого уничтожения используется механизм самоуничтожения, основанный на подсчете ссылок. В COM используется сервер транзакций.
- Платформы CORBA: DOS, Windows 3.11, Windows 98, Windows NT, OS / 2, Unix, Solaris. Платформы COM: Windows 2000, Windows XP, Windows 9x и Windows NT, OpenVMS, Solaris.
Идентификация объектов CORBA и COM в сети. Основные различия
CORBA и СОМ абсолютно по-разному подходят к проблемам идентификации (identity) объектов и их сохранения в долговременной памяти (persistance). CORBA вводит понятие объектной ссылки (object reference), которая уникальным образом идентифицирует объект в сети. Тем самым экземпляру объекта дается право на существование в течение некоторого времени. Объекты могут активироваться, сохраняться в долговременную память, позже вновь реактивироваться и деактивироваться, и при этом объектная ссылка будет указывать все время на одно и то же конкретное воплощение объекта. Для объектов, предназначенных для длительного использования, объектные ссылки могут интегрироваться со службой каталогов или службой имен. Клиент не имеет никаких легальных средств обнаружить, куда и каким образом сохраняется экземпляр объекта. Служба именования Interoperable Naming Service предназначена для прозрачного поиска и вызова объектов, не зависящего от конкретной реализации ORB.
В СОМ понятие объектной ссылки отсутствует. Ближайший аналог - это механизм moniker, обеспечивающий преобразование символьного имени объекта в указатель интерфейса. Этот механизм действует для тех объектов, которые сохраняются в долговременной памяти. Два же активных объекта считаются идентичными, если для них совпадают указатели на интерфейс IUnknown.
Для долговременного хранения в СОМ поддерживаются две модели. Первая и изначальная модель предоставляет клиенту возможность управлять хранением объекта. Другой, более поздний вариант сохранения в долговременную память в СОМ предусматривает использование Microsoft Transaction Server (MTS), который обеспечивает управление хранением со стороны сервера.
Языки описания интерфейсов CORBA и COM. Основные свойства
В CORBA язык описания интерфейсов - важнейшая часть архитектуры, основа схемы интеграции объектов. Все интерфейсы и типы данных определяются на IDL. Различные языки программирования поддерживаются благодаря заданным отображениям между описаниями типов данных на IDL в соответствующие определения на конкретном языке. CORBA IDL задает определения, которые могут отображаться в множество различных языков, не требуя при этом никаких изменений от целевого языка. Эти отображения реализуются компилятором IDL, который генерирует исходные коды на нужном языке. В настоящий момент поддерживается отображение в C, C++, SmallTalk, Ada, Delphi, Visual Basic, Cobol и Java. Сам IDL синтаксически напоминает декларации типов в Си++, но не идентичен этому языку.
В Microsoft IDL (MIDL) - лишь один из возможных способов определения интерфейсов объекта. Технология COM реализует интеграцию на двоичном уровне, поэтому все спецификации и стандарты, относящиеся к уровню исходных текстов компонентов, являются вспомогательными и не оказывают решающего влияния на общую архитектуру системы. Язык MIDL привязан к платформе.
MIDL, являющийся расширением DCE RPC IDL, не определяет общего набора типов данных, доступных различным языкам программирования. На MIDL можно определить интерфейсы и типы данных, которые соответствуют программам на C, C++, Visual Basic, Java.
Основные встроенные объектные службы CORBA и COM
- защита (security),
- управление жизненным циклом (lifecycle managemеnt),
- информация о типах (type information),
- именование (naming),
- доступ к базам данных (database access),
- передача данных (data transfer),
- регистрация (registry),
- асинхронное взаимодействие.
- именование (naming),
- события (events),
- жизненный цикл (life cycle),
- долговременное хранение объектов (persistent),
- транзакции (transactions),
- контроль за доступом к разделяемым ресурсам (concurrency control),
- отношения (relationsips),
- импорт / экспорт (externalization),
- запросы (query),
- лицензирование (licensing),
- свойства (property),
- время (time),
- защита (security),
- переговоры между объектами (object trader),
- сбор объектов (object collections),
- служба асинхронного обмена сообщениями (asynchronous messaging).
Операционные среды функционирования CORBA и COM. Выводы сравнительного анализа двух технологий.
- Обе технологии развиваются и усложняются.
- CORBA является более универсальной, чем COM, рассчитана на неоднородную сеть.
- CORBA соответствует распределенной системе отрасли, COM - рабочей группе.
- COM уступает CORBA в организации защиты, управлении транзакциями и координируемом распределении структур.
- Ряд продуктов позволяет использовать совместно эти технологии.
Практические занятия
Постановка задачи. Проектирование данных на концептуальном и логическом уровнях. Нормализация отношений.
Презентация по ER-моделированию
Подготовка SQL скриптов генерации схемы отношений БД в ERwin. Разработка скрипта для ввода тестовой информации.
Видео-презентация (Для проигрывания требуется Windows Media Player)
Архитектура MS SQL Server 2005. Настройка и использование основных компонент среды. Создание учебной базы данных.
Видео-презентация (Для проигрывания требуется Windows Media Player)
Работа с СУБД MS SQL Server 2005, ORACLE 10g. Примеры соединений с БД, технологии разработки клиенского приложения
Использование технологии Java Database Connectivity (JDBC) для работы с базами данных
Примеры к презентации
SQL-скрипты, проект и исходные коды
package org.mai806.jdbcsample; import java.sql.*; public class QuerySample { public static void main(String[] args) throws Exception { /* ======== Подключение к MS SQL Server ===== */ // Загрузка драйвера Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); // Соединение с базой данных Connection connection = DriverManager.getConnection( "jdbc:sqlserver://localhost:1433;databaseName=o01;", // localhost - сервер СУБД, o01 - имя базы данных "sa", "123"); // пользователь, пароль /* ======== Подключение к Oracle ============ // Загрузка драйвера Class.forName("oracle.jdbc.OracleDriver"); // Соединение с базой данных Connection connection = DriverManager.getConnection( "jdbc:oracle:thin:@localhost:1521:orcl", // localhost - сервер СУБД, orcl - SID базы оракла "o01", "o01"); // пользователь, пароль // Создание Statement PreparedStatement stmt = connection.prepareStatement ("select ID, NAME from PERSON where NAME like ?"); stmt.setString(1, "%S%"); // Выполнение запроса ResultSet rs = stmt.executeQuery(); // Перебор результата выполнения запроса while(rs.next()) { // Пример выбора параметра по номеру или по имени System.out.println("ID: " + rs.getLong(1) + "; NAME="+ rs.getString("NAME")); } // закрытие использованных ресурсов БД rs.close(); stmt.close(); connection.close(); } }Листинг P.1. Выполнение запроса: QuerySample.java
package org.mai806.jdbcsample; import java.sql.*; import java.util.ResourceBundle; public class StoredProcedureSample { private static Connection connection = null; public static void main(String[] args) throws Exception { // Получение соединения из значений параметров в файле properties ResourceBundle properties = ResourceBundle.getBundle("database"); Class.forName(properties.getString("driver")); connection = DriverManager.getConnection( properties.getString("url"), properties.getString("user"), properties.getString("password")); transferAmount(1,2,100.0); connection.close(); } /** * Переводит указанную сумму с одного счета на другой * @param from счет плательщика * @param to счет получателя * @param amount сумма */ public static void transferAmount(long from, long to, double amount) throws Exception { // Создание Statement CallableStatement stmt = connection.prepareCall("{call TransferAmount(?,?,?)}"); // Установка параметров stmt.setLong(1, from); stmt.setLong(2, to); stmt.setDouble(3, amount); // Выполнение процедуры stmt.execute(); } }Листинг P.2. Выполнение хранимой процедуры: StoredProcedureSample.java
package org.mai806.jdbcsample; import java.sql.*; import java.util.ResourceBundle; public class TransactionalSample { private static Connection connection = null; public static void main(String[] args) throws Exception { // Получение соединения из значений параметров в файле properties ResourceBundle properties = ResourceBundle.getBundle("database"); Class.forName(properties.getString("driver")); connection = DriverManager.getConnection( properties.getString("url"), properties.getString("user"), properties.getString("password")); // Ручное управление транзакциями connection.setAutoCommit(false); try { transferAmount(2, 1, 10.0); } finally { connection.close(); } } /** * Переводит указанную сумму с одного счета на другой * @param from счет плательщика * @param to счет получателя * @param amount сумма */ public static void transferAmount(long from, long to, double amount) throws Exception { PreparedStatement stmt = null; Statement query = null; try { stmt = connection.prepareStatement ("update ACCOUNT set AMOUNT=AMOUNT+? where ID=?"); // Забираем сумму со счета плательщика stmt.setDouble(1, -amount); stmt.setLong(2, from); stmt.execute(); // Добавляем сумму на счет получателя stmt.setDouble(1, amount); stmt.setLong(2, to); stmt.execute(); // Пост-проверка: отрицательность счета плательщика query = connection.createStatement(); ResultSet rs = query.executeQuery( "select AMOUNT from ACCOUNT where ID="+from+" and AMOUNT<0"); if (rs.next()) { throw new Exception("На счете №"+from+" недосточно средств ["+(amount+rs.getDouble(1))+"] для снятия суммы ["+amount+"]"); } connection.commit(); System.out.println("Перечисление средств успешно выполнено"); } catch(Exception e) { e.printStackTrace(); connection.rollback(); } finally { if (stmt!=null) stmt.close(); if (query!=null) query.close(); } } }Листинг P.3. Работа с транзакциями: TransactionalSample.java