Как лучше сдизайнить объект который бы использовался различными типами клиентов: из ASP (VBscript) и из ISAPI DLL написанной на С++
идея вся в том чтобы обеспечить независимость веб-серверного кода (ASP) от структуры базы данных запихнув всю работу с SQL в COM+ объекты
Понятно что тут дело первой важности придумать хороший интерфейс
какие рекомендоации по
1.способу доступа к БД (ADO, ODBC, OLEDB)
2.потоковая модель для компоненты (Apartment,Both,Neutral)?
компоненты всегда будут out-of-process т.е. маршаллинг имеет место быть. вопрос в каком случае он будет быстрее осуществляться. подозреваю что ASP использует STA модель(?)
3.использование дополнительных компонент (COM, не COM+) как внешних библиотек
возможны ли подводные камни тут?
4. обмен данными между COM+ и клиентом: VARIANT array, список BSTR-ов или готовый объект? (например ADO recordset)
например у меня есть объект Customer с кучей параметров (имя,адрес,телефон и т.д.)
Re: Вопрос по дизайну и архитектуре COM+ компонент
1. ADO — удобный и достаточно скоростной
2. Neutral обычно работает быстрее и требует меньших ресурсов, но сложнее писать. В большинстве случаев вполне достаточно Apartment
3. Использование COM компонент из COM+ компонент? Если эти COM обьекты не работают с базой и не требуется поддерживать транзакционность, то особых проблем, связанных с COM+, думаю что не будет
4. Массив, строка или рекордсет имеют примерно одинаковую производительность. Я предпочитаю ADO рекордсет, так как с ним удобнее работать.
Re[2]: Вопрос по дизайну и архитектуре COM+ компонент
От:
Аноним
Дата:
01.08.02 05:35
Оценка:
Здравствуйте andsm, Вы писали:
A>1. ADO — удобный и достаточно скоростной
у нас используется в данный момент ODBC для доступа из С++,
и ADO из ASP. тут нужна некая унификация, но мне кажется что ADO
будет медленнее чем ODBC(?). сам не сравнивал, лишь предполагаю
A>2. Neutral обычно работает быстрее и требует меньших ресурсов, но сложнее писать. В большинстве случаев >вполне достаточно Apartment
Майкрософт рекомендует для COM+ Neutral или MTA. если я поставлю Both, ничего плохого же
не должно быть? тогда потоковая модель не будет зависеть от типа клиента
A>3. Использование COM компонент из COM+ компонент? Если эти COM обьекты не работают с базой и не требуется >поддерживать транзакционность, то особых проблем, связанных с COM+, думаю что не будет
с базой точно не будут. это компонента шифрования паролей и работы с кредитными карточками
(связана по HTTP с внешним провайдером — электронным банком)
A>4. Массив, строка или рекордсет имеют примерно одинаковую производительность. Я предпочитаю ADO рекордсет, так как с ним удобнее работать.
наверное да, рекордсет можно рассматривать как 2-мерный массив переменной длины в который
можно что угодно запихать. мне собственно нужно будет шоппинг карту реализовать
Re[2]: Вопрос по дизайну и архитектуре COM+ компонент
Здравствуйте andsm, Вы писали:
A>4. Массив, строка или рекордсет имеют примерно одинаковую производительность. Я предпочитаю ADO рекордсет, так как с ним удобнее работать.
Я делал VARIANT array, получается применением метода GetRows объекта ADORecordset. Потом этот массив возвращал клиентам.
Удачи.
ICQ #311116826
Re: Вопрос по дизайну и архитектуре COM+ компонент
Здравствуйте Аноним, Вы писали:
А>Как лучше сдизайнить объект который бы использовался различными типами клиентов: из ASP (VBscript) и из ISAPI DLL написанной на С++
А>идея вся в том чтобы обеспечить независимость веб-серверного кода (ASP) от структуры базы данных запихнув всю работу с SQL в COM+ объекты
А>Понятно что тут дело первой важности придумать хороший интерфейс А>какие рекомендоации по А>1.способу доступа к БД (ADO, ODBC, OLEDB)
ODBC уже давно устарел
ADO (через OLEDB) — основная технология доступа к базам данных у Microsoft. Рекомендуется использовать родной OLEDB-провайдер для работы с базой данных (если нет OLEDB-провайдеров, можно использовать OLEDB-провайдер для ODBC).
Если говорить о производительности, то ADO и OLEDB обеспечивают примерно равную производительность, ODBC намного медленнее.
А>3.использование дополнительных компонент (COM, не COM+) как внешних библиотек А>возможны ли подводные камни тут?
проблем быть не должно
А>4. обмен данными между COM+ и клиентом: VARIANT array, список BSTR-ов или готовый объект? (например ADO recordset) А>например у меня есть объект Customer с кучей параметров (имя,адрес,телефон и т.д.)
Используй ADO Recordset.
Остальные способы использовать не рекомендую (строки или variant array необходимо будет разбирать на клиенте, это не очень удобно, нет проверки типов передаваемых данных).
Если необходимо выводить данные в виде Grid'ов, отчетов Crystal Report и т.п., то и здесь ADO Recordset — оптимальное решение.
Re[2]: Вопрос по дизайну и архитектуре COM+ компонент
От:
Аноним
Дата:
02.08.02 06:47
Оценка:
SMS>Используй ADO Recordset. SMS>Остальные способы использовать не рекомендую (строки или variant array необходимо будет разбирать на клиенте, это не очень удобно, нет проверки типов передаваемых данных).
SMS>Если необходимо выводить данные в виде Grid'ов, отчетов Crystal Report и т.п., то и здесь ADO Recordset — оптимальное решение.
больше собственно вопрос о том как передавать В компонент а не из него,
чтобы минимизировать число вызовов методов передающих параметры до одного.
я раньше делал кодированную строку в которой параметры описывают
сами себя
т.е. строка вида "NAME=Vasya;LNAME=Pupkin;BALANCE=3.95;... "
конструировать ее можно с помощью класса-обертки, включающего
в себя упаковщик параметров и парсер
strParam = new CParamString();
strParam.AddValue("NAME",name);
strParam.AddValue("LNAME",lname);
// ...
pObj->Send(strParam.GetString());
Здравствуйте Аноним, Вы писали:
А>больше собственно вопрос о том как передавать В компонент а не из него, А>чтобы минимизировать число вызовов методов передающих параметры до одного. А>я раньше делал кодированную строку в которой параметры описывают А>сами себя
У вас клиент и сервер на разных машинах находятся или на одной?
По поводу DCOM. Я могу ошибаться, но насколько я понимаю, ситуация следующая.
Если мы работаем через рекордсет, происходят следующие вызовы: pRst->get_Fields()->get_Item("field1")->get_Value. На одно поле приходится 3 вызова.
Если же работаем через IDispatch (ASP), то умножаем еще на 3.
Я прав или нет?
Множество интерфейсов за один раз не попросишь — объекты все разные.
Получаем некоторую нагрузку на сеть, с некоторыми задержками.
Вроде бы логичнее уменьшить число обращений, как вы и говорите. Разбирать рекордсет и
складывать в в BSTR, VARIANT или SAFEARRAY с этой точки зрения лучше, но возни больше.
А как вы смотрите по поводу XML? Если у вас SQL server, получаете от него данные в XML-е, запихиваете в строку и посылаете клиенту. То же самое можно делать и на сервере. Получаем от клиента XML, парсим его и делаем запрос к серверу.
Для этого не нужно писать свой парсер — можно воспользоваться MSXML. Если нужна информация
о типах данных — добавляете атрибуты (хотя, наверно, это излишне).
XML, полученный клиентом со стороны сервера трансформируете его на клиентской стороне
при помощи XSL и выдаете в браузер.
Посмотрите в эту сторону, может быть так будет проще в вашем случае?
Если же у вас клиент и сервер на одной машине, то не обязательно этот огород городить.
Можно, кстати, поискать информацию на эту тему. Может кто интересовался уже этим вопросом?
Я просто не встречал соответствующих статей. Был бы благодарен, если бы кто поделился
знаниями. Может есть какие исследований с красивыми диаграммами и циферками?
Успехов!
К этому моменту у меня внутри 0.5, 0.7, 0.33 (с) НС
Re[4]: Вопрос по дизайну и архитектуре COM+ компонент
Здравствуйте WPooh, Вы писали:
WP>У вас клиент и сервер на разных машинах находятся или на одной? WP>По поводу DCOM. Я могу ошибаться, но насколько я понимаю, ситуация следующая. WP>Если мы работаем через рекордсет, происходят следующие вызовы: pRst->>get_Fields()->get_Item("field1")->get_Value. На одно поле приходится 3 вызова. WP>Если же работаем через IDispatch (ASP), то умножаем еще на 3. WP>Я прав или нет? :shuffle:
ADO Recordset оптимизирован для передачи между машинами, т.е при пересылке происходит его полное перемещение с машины на машину. Для передачи используется формат ADTG — Advanced Data Tablegram Тем самым все вызовы вида pRst->>get_Fields()->get_Item("field1")->get_Value будут локальными, не нагружают сеть. Разборка рекордсета и складывание в BSTR, VARIANT или SAFEARRAY ведет к той же произодительности, но теряется удобство работы, самоописание данных + приходится писать дополнительный код, без которого вполне можно было бы обойтись. Использование XML несколько снижает производительность, так как необходимый обьем данных для пересылки в этом случае заметно превышает пересылаемый рекордсетом обьем данных — из-за различных тегов и недостаточно оптимизированного формата. Считаю что ADO Recordset в абсолютном большинстве случаев является лучшим транспортом для пересылки данных между уровнями, находящимися на различных машинах.
Кроме этого по архитектуре COM+ компонент — я предпочитаю компоненты без состояния. Они обеспечивают лучшую масштабируемость (по сравнению с компонентами с состоянием). В некоторых случаев специфика задачи может потребовать компоненты с состоянием, но в большинстве случаев можно использовать компоненты без состояния.
Re[3]: Вопрос по дизайну и архитектуре COM+ компонент
Здравствуйте Аноним, Вы писали:
A>>1. ADO — удобный и достаточно скоростной А>у нас используется в данный момент ODBC для доступа из С++, А>и ADO из ASP. тут нужна некая унификация, но мне кажется что ADO А>будет медленнее чем ODBC(?). сам не сравнивал, лишь предполагаю
Я думаю ADO быстрее ODBC. Для MS SQL Server я это проверял — заметно быстрее, для остальных баз данных не проверял.
Re[5]: Вопрос по дизайну и архитектуре COM+ компонент
К этому моменту у меня внутри 0.5, 0.7, 0.33 (с) НС
Re[4]: Вопрос по дизайну и архитектуре COM+ компонент
От:
Аноним
Дата:
04.08.02 02:24
Оценка:
Здравствуйте WPooh, Вы писали:
WP>Здравствуйте Аноним, Вы писали:
WP>По поводу DCOM. Я могу ошибаться, но насколько я понимаю, ситуация следующая. WP>Если мы работаем через рекордсет, происходят следующие вызовы: pRst->>get_Fields()->get_Item("field1")->get_Value. На одно поле приходится 3 вызова. WP>Если же работаем через IDispatch (ASP), то умножаем еще на 3. WP>Я прав или нет? :shuffle:
думаю что нет. ибо рекордсет целиком передается на клиентскую машину
и все вышеуказанные вызовы происходят с локальным объектом а не объектом на сервере
WP>А как вы смотрите по поводу XML? Если у вас SQL server, получаете от него данные в XML-е, запихиваете в строку и посылаете клиенту. То же самое можно делать и на сервере. Получаем от клиента XML, парсим его и делаем запрос к серверу. WP>Для этого не нужно писать свой парсер — можно воспользоваться MSXML. Если нужна информация WP>о типах данных — добавляете атрибуты (хотя, наверно, это излишне). WP>Успехов!
в качестве эксперимента я написал собственный парсер XML-строк в виде класса-обертки.
структура данных для входных параметров простая (одномерная)
пример параметризованной строки передаваемой серверу:
Re[5]: Вопрос по дизайну и архитектуре COM+ компонент
От:
Аноним
Дата:
04.08.02 02:30
Оценка:
A>Кроме этого по архитектуре COM+ компонент — я предпочитаю компоненты без состояния. Они обеспечивают >лучшую масштабируемость (по сравнению с компонентами с состоянием). В некоторых случаев специфика задачи >может потребовать компоненты с состоянием, но в большинстве случаев можно использовать компоненты без
в случае использования в COM+ пула объектов компоненты обязательно должны быть stateless.
в противном случае приватные данные КОМ-класса созданные одним клиентом будут портиться другим клиентом между вызовами.