View
248
Download
3
Embed Size (px)
Citation preview
Используем объекты CachéБакулин Сергей
Москва, 11 апреля
Caché Server Pages (CSP)Caché Server Pages (CSP)
Объекты в Caché 5.1
ПлатформыПлатформы
Ядро CachéЯдро Caché
SQLSQL
ODBCODBC JDBCJDBC
ObjectsObjectsDirectDirect
Cal
lin
Cal
lin
Cal
lou
tC
allo
ut
Vis
MV
isM
Caché Object Script & Caché BasicCaché Object Script & Caché Basic
MultiValueMultiValue
SO
AP
SO
AP
C+
+C
++
Java
Java
Per
lP
erl
Act
iveX
Act
iveX
Pyt
ho
nP
yth
on
Jalo
pen
oJa
lop
eno
.NE
T.N
ET
Сервер CachéСервер Caché
Объектная модель Объектная модель CachéCaché• Множественное наследованиеМножественное наследование
• АтрибутыАтрибуты
– ЛитералыЛитералы
– СсылкиСсылки
– КоллекцииКоллекции
– ПотокиПотоки
• МетодыМетоды
– Методы объектовМетоды объектов
– Методы классовМетоды классов
• Запросы на Запросы на SQLSQL
• Объекты Объекты CachéCaché в клиентском в клиентском приложенииприложении
– Создание, редактирование и Создание, редактирование и удаление объектов удаление объектов CachéCaché
– Запуск методов классов Запуск методов классов CachéCaché– Работа с запросами классов Работа с запросами классов
CachéCaché
• Объектная модель данныхОбъектная модель данных
• Бизнес логика в Бизнес логика в CachéCaché
• Нет необходимости Нет необходимости использовать реляционные использовать реляционные интерфейсы с ОО средством интерфейсы с ОО средством разработкиразработки
Объекты в Caché 5.1
Объектная модель Объектная модель CachéCaché• Множественное наследованиеМножественное наследование
• АтрибутыАтрибуты
– ЛитералыЛитералы
– СсылкиСсылки
– КоллекцииКоллекции
– ПотокиПотоки
• МетодыМетоды
– Методы объектовМетоды объектов
– Методы классовМетоды классов
• Запросы на Запросы на SQLSQL
Caché Object Factory
• ActiveX-ActiveX-компонент компонент CacheObject.FactoryCacheObject.Factory
• Объектная фабрикаОбъектная фабрика– Называется так, поскольку именно Называется так, поскольку именно
этот объект создает объекты классов этот объект создает объекты классов CachéCaché
– Эта же фабрика используется для Эта же фабрика используется для открытия объектов из БД и открытия объектов из БД и сохранения ихсохранения их
• Разработчик получает доступ ко всем Разработчик получает доступ ко всем свойствам и методам объектовсвойствам и методам объектов
Caché Objects : использование фабрики
Uses ComObj;Var Factory : Variant; Pers: Variant;procedure Start();Begin Factory := CreateOleObject( 'CachéObject.Factory'); Factory.Connect( 'cn_iptcp:127.0.0.1[1972]:Samples'); Pers := Factory.New(‘User.Person'); Pers.Name=‘Serguey’; Pers.sys_Save;End;
Web-сервисы
• Простой Простой Web-Web-сервиссервис
• Создан мастером Создан мастером Web-Web-сервисовсервисов
• Автоматически Автоматически на веб-сервере на веб-сервере помещается помещается WSDLWSDL -- описание описание
Class User.CacheServ Extends %SOAP.WebService [ProcedureBlock]{/// Название сервисаParameter SERVICENAME = "AplusB";/// URL для вызова вебсервисаParameter LOCATION = "http://localhost/csp/samples";/// AplusBMethodClassMethod AplusBMethod(a as %Integer, b as %Integer) As %String [ WebMethod ]{ Quit a+b}
http://Сервер/csp/приожение/класс.cls?WSDLhttp://Сервер/csp/приожение/класс.cls?WSDL
Генератор классов C++
• Новое расширение Новое расширение компилятора классов компилятора классов Caché, создающее Caché, создающее классы С++ (код и классы С++ (код и заголовочные файлы) заголовочные файлы) на основании классов, на основании классов, определенных в Caché определенных в Caché Class DictionaryClass Dictionary
• Является внешним по Является внешним по отношении к отношении к Caché Caché приложениемприложением
С++С++С++С++
ПроксиПроксиклассыклассы
CachéCachéCachéCaché
Библиотека Библиотека классовклассов
Библиотека Библиотека классовклассов
Библиотека Caché C++
• Новый набор классов C++, с помощью Новый набор классов C++, с помощью которого реализуется проекция классов которого реализуется проекция классов Caché Caché в классы в классы C++C++ с сохранением их с сохранением их функциональностифункциональности
• Поддерживаются среды разработкиПоддерживаются среды разработки
• MS VS 6.0MS VS 6.0
• MS VS 7.1MS VS 7.1
• Borland C++ Builder 6.0Borland C++ Builder 6.0
• ggссcc
• Нужно еще? Нужно еще? Свяжитесь с нами!Свяжитесь с нами!
Раннее связывание и динамические объектыd_ref<d_ref<UserUser__PersonPerson> > perper = = UserUser__PersonPerson::openid(&db,L"1");::openid(&db,L"1");
d_string name=d_string name=perper->getName();->getName();
d_string res=d_string res=perper->Method();->Method();
d_ref<Dyn_obj>d_ref<Dyn_obj>perper=NULL;=NULL;
const_name_t cl_name(L"const_name_t cl_name(L"UserUser..PersonPerson"); ");
perper = Dyn_obj::openid(&db, cl_name, L"1"); = Dyn_obj::openid(&db, cl_name, L"1");
d_ref<Dyn_obj> d_ref<Dyn_obj> perper = =
Dyn_obj::openref(Dyn_obj::openref(perper-->get_property(L“>get_property(L“NameName"), &db);"), &db);
D_type** args =(D_type**)db.get_arg_ptrs_buf();D_type** args =(D_type**)db.get_arg_ptrs_buf();
d_int arg1(1);d_int arg1(1); args[0]=&arg1;args[0]=&arg1;
d_string d_string resres((perper->run_obj_method(L“->run_obj_method(L“MethodMethod",args,1));",args,1));
• Стандартный подход для Стандартный подход для большинства разработчиковбольшинства разработчиков
• Удобство синтаксисаУдобство синтаксиса
• Работа непосредственно с Работа непосредственно с прокси-классамипрокси-классами
o Динамическое Динамическое определение определение типов данныхтипов данных
o Помогает Помогает более широко более широко использовать использовать наследованиенаследование
Использование Java
• BEA WebLogic8.1BEA WebLogic8.1
• JBoss4.0 3JBoss4.0 3
CachéCaché
Java BindingJava
BindingEJB
BindingEJB
Binding
• Генератор Генератор классовклассов
• Библиотека Библиотека прокси-классовпрокси-классов
• Объектный Объектный серверсервер
EJB в один момент
Автоматически создаетАвтоматически создает::
• Entity beanEntity bean
• Дескриптор установкиДескриптор установки
• Сценарий установкиСценарий установки
• Тестовое приложениеТестовое приложение
Автоматически создаетАвтоматически создает::
• Entity beanEntity bean
• Дескриптор установкиДескриптор установки
• Сценарий установкиСценарий установки
• Тестовое приложениеТестовое приложение
Пример работы с объектом Cachéиз Java
• Открываем объектОткрываем объект
person = (Sample.Person)Sample.Person._open(dbconnection, new person = (Sample.Person)Sample.Person._open(dbconnection, new Id(strID)Id(strID),3,3););
• Выводим свойства объектовВыводим свойства объектов
System.out.println("Name: " + person.getName());System.out.println("Name: " + person.getName());
• Изменяем свойстваИзменяем свойства
person.person.ssetetNameName("("SergueySerguey"); ");
• Сохраняем объект в БДСохраняем объект в БД
person._save();person._save();
• Закрываем объектЗакрываем объект
dbconnection.closeObject(person.getOref());dbconnection.closeObject(person.getOref());
person = null; person = null;
Perl Binding, Python Binding
•Используются специальные пакеты Используются специальные пакеты системных прокси-классовсистемных прокси-классов
–Соединение с серверомСоединение с сервером
–Фабрика объектовФабрика объектов
–Полная поддержка объектной Полная поддержка объектной модели модели CachéCaché
Пример для Python
• Создание соединения с серверомСоздание соединения с серверомconn = intersys.pythonbind.connection() conn = intersys.pythonbind.connection() conn.connect_now(url,user,password, None) conn.connect_now(url,user,password, None)
database = intersys.pythonbind.database(conn) database = intersys.pythonbind.database(conn)
• Создаем новый объектСоздаем новый объектperson = database.create_new("Sample.Person", None) person = database.create_new("Sample.Person", None)
• Работаем со свойствамиРаботаем со свойствамиperson.set("Name","Doe, Joe A") name = person.get("Name") person.set("Name","Doe, Joe A") name = person.get("Name")
• Выполняем методВыполняем методanswer = person.run_obj_method("Addition",[17,20]) answer = person.run_obj_method("Addition",[17,20])
• Сохраняем объектСохраняем объектperson.run_obj_method("%Save",[]) person.run_obj_method("%Save",[])
ADO.Net Managed Provider
C#, VBC#, VB..Net, …Net, …C#, VBC#, VB..Net, …Net, …
AD
OA
DO
.. Net
Net O
bjectO
bject
• Высокая скорость Высокая скорость работы в работы в объектном и объектном и реляционном реляционном представлении в представлении в рамках одного рамках одного приложенияприложения
• Visual Studio.Net Visual Studio.Net 20052005
““РоднаяРодная” .Net ” .Net связкасвязка
CachéCachéCachéCaché
Проецируем классы .Net
Windows
.NET Client.NET Client.NET Client.NET Client
Прокси-КлассыПрокси-Классы
ISC ClassBinderISC ClassBinder
CachéCaché
Определение класса
Определение класса
Исходный код
Исходный код
Клиент на любой платформе
• Самостоятельное приложение илиСамостоятельное приложение или инструмент инструмент Visual StudioVisual Studio
• Сгенерированный код напрямую Сгенерированный код напрямую используется приложением используется приложением .Net.Net
Использование Генератора классовИспользование Генератора классовИспользование Генератора классовИспользование Генератора классов
Мастер создания классов .Net
.Net приложение, создающее классы-проекции для
–С#
–C++
–VB.Net
Caché Managed Provider для .Net
Windows
.NET Framework.NET Framework.NET Framework.NET Framework
.NET приложение.NET приложение
КодКод
Caché / EnsembleCaché / Ensemble
Классы/ТаблицыКлассы/Таблицы
Managed Objects
Managed Objects
Сервер (любая платформа)
ADO.NETADO.NET
ObjectsObjects
SQLSQL
TCPTCP
Пример работы с объектом
Sample.Person person = Sample.Person.OpenId(CacheConnect, "1");
Console.WriteLine(“Значение свойств: \r\n "
+ person.Id() + ": "
+ person.Name
Пример SQL-запроса
string SQLtext = "SELECT * FROM Sample.Person WHERE ID = 1";
CacheCommand Command = new CacheCommand(SQLtext, CacheConnect);
CacheDataReader Reader = Command.ExecuteReader();
while (Reader.Read()) {
Console.WriteLine("Provider output: \r\n "
+ Reader[Reader.GetOrdinal("ID")] + ": "
+ Reader[Reader.GetOrdinal("Name")]);
};
Объекты и таблицы
CacheCommand CacheCommand cacheCommandcacheCommand = = User.User.PersonPerson.FindAll(cacheConnection); .FindAll(cacheConnection);
UserUserTable = new DataTable();Table = new DataTable();
UserUserTable.Load(Table.Load(cacheCommandcacheCommand.ExecuteReader()); .ExecuteReader());
UserDSUserDS.DataSource = .DataSource = UserUserTable;Table;
DropDrop.DisplayMember =.DisplayMember = "Name"; "Name";
DropDrop.ValueMember = "ID"; .ValueMember = "ID";
• В коде можно сочетать В коде можно сочетать объектный и реляционный объектный и реляционный подход в одном приложенииподход в одном приложении
Использование коллекций литералов и ссылок на объекты
CacheListOfStrings CacheListOfStrings colorscolors = = personperson.FavoriteColors.FavoriteColors
int row = 0;int row = 0;
foreach (string color in foreach (string color in colorscolors) {) {
Display.WriteLine(" Element #" + row++ + " = " + color);Display.WriteLine(" Element #" + row++ + " = " + color);
}}
//////Плюс стандартные методы обработки коллекций Плюс стандартные методы обработки коллекций CachéCaché
if (if (colorscolors.Count > 0) .Count > 0) colorscolors.RemoveAt(0);.RemoveAt(0);
colorscolors.Insert(0,"Blue");.Insert(0,"Blue");
colorscolors.Add("Green");.Add("Green");
Наследование и отношения
•Классы-проекции .Net соответствуют по структуре своим оригиналам в Caché. Работать с ними можно аналогичным образом:
CacheRelationshipObject CacheRelationshipObject colleaguescolleagues = = companycompany.Employees;.Employees;
foreach (Sample.Employee colleague in foreach (Sample.Employee colleague in colleaguescolleagues) {) {
Display.WriteLine("\t" + colleague.Name);Display.WriteLine("\t" + colleague.Name);
}}
В версии 5.2. - Jalapenо
•Java Object Schema ImportJava Object Schema Import
–Традиционно Традиционно Caché Caché предлагает предлагает механизмы по созданию прокси-механизмы по созданию прокси-классов из хранимых классов классов из хранимых классов CachéCaché. . Jalapeno Jalapeno обращает этот обращает этот механизм, позволяет создавать механизм, позволяет создавать классы классы Caché Caché из существующих из существующих описаний классов описаний классов Java.Java.
Что нам все это даст?!
•Простота проектирования и Простота проектирования и модернизации приложениймодернизации приложений
•Накопленный багаж ОО практик при Накопленный багаж ОО практик при разработке приложенийразработке приложений
•Единство моделей данных на Единство моделей данных на клиенте и на сервереклиенте и на сервере
Таким образом…
• Полноценная объектная модель на всех уровнях Полноценная объектная модель на всех уровнях разработкиразработки
• Объектные средства реализации бизнес логикиОбъектные средства реализации бизнес логики
• Широкие возможности по применению объектных Широкие возможности по применению объектных средств разработкисредств разработки
– .Net.Net– JavaJava– C++C++– DelphiDelphi– PerlPerl– PythonPython
• Возможность сочетать мощь объектного подхода со Возможность сочетать мощь объектного подхода со стандартным стандартным SQL-SQL-доступомдоступом
Возьмите у нас Возьмите у нас Caché 5.1Caché 5.1!!
Используем объекты Caché Бакулин Сергей