Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2004.04.25;
Скачать: [xml.tar.bz2];

Вниз

Вопрос про мидас   Найти похожие ветки 

 
Alexander_K ©   (2004-03-17 15:19) [120]

Сейчас решил посмотреть из диспетчера задач сколько потоков у меня в сервере
При запуске 1 клиента запустился сервер с 4 потоками
При логине к базе в клиенте на сервере стало 5 потоков
При запуске последующих клиентов (6 штук) потоков на сервере не увеличилось!
Выходит как будь-то single...
Но в проекте у меня стоит
Instancing - Multiple use
Threading model - Apartment

В чем грабли?


 
Nikolay M. ©   (2004-03-17 15:33) [121]


> Alexander_K ©   (17.03.04 15:19) [120]

А счетчик RDM-ов, как где-то в начале советовали, выводишь?


 
Michail Dalakov ©   (2004-03-17 15:44) [122]

To Alexander_K ©   (17.03.04 15:19) [120]

Это и следовало ожидать, чудес не бывает

Как создаются RemoteComObject-ы?


 
Asdor ©   (2004-03-17 15:46) [123]

Какая фабрика классов используется при создании RDM?

Должна использоваться TComponentFactory (в Дельфи так называется, в билдере может CComponentFactory).
Если нет - то грабли возможно здесь...


 
Michail Dalakov ©   (2004-03-17 15:47) [124]

To Nikolay M. ©   (17.03.04 15:33) [121]

Причем здесь счетчик RDM-ов, что в одном потоке нельзя создать два RDM-а?


 
Reindeer Moss Eater ©   (2004-03-17 16:08) [125]

Это и следовало ожидать, чудес не бывает

пост № 84: Выдан диагноз.
посто № 85: реплика "Так не бывает".

И все по-новой ...


 
Alexander_K ©   (2004-03-17 16:12) [126]

Asdor ©   (17.03.04 15:46) [123]

В C++ Builder похоже немного по другому как-то, потому что я так пока и не нашел где RDM создается и про TComponentFactory в проекте моем я ничего не нашел...


 
Asdor ©   (2004-03-17 16:24) [127]

2 Alexander_K ©   (17.03.04 16:12) [126]

Код в студию (либо мне на почту)...

Либо смотри секцию инициализации модуля (если таковые есть в билдере). Там должно быть что-то в духе TComponentFactory(или какая-то другая Factory)->Create(ComServer, Класс_Твоего_RDM, Class_ID_ТвоегоRDM, ciMultiInstance, tmApartment) ...


 
Michail Dalakov ©   (2004-03-17 16:46) [128]

To Reindeer Moss Eater ©   (17.03.04 16:08) [125]

Да, не бывает такое, чтобы для двух RDM созданных в разных потоках метод Open вызывался в одном потоке. (остальное по контексту выше, дабы не повторяться)

C чем ты не согласен?

Что невозможного или незаконного в этом? [109]

Все возможно


 
Reindeer Moss Eater ©   (2004-03-17 16:54) [129]

А с чем ты был несогласен в 85 посте, в котором ты возражал против поста №84 (против подчеркнутого диагноза в посте №84)
?


 
Michail Dalakov ©   (2004-03-17 17:10) [130]

Итак, что мы выяснили:

-RDM"ов у автора несколько.
-Каждый открывает свое подключение к Ораклу.

Метод Open у всех датасетов во всех RDM вызывается в одной и той же нити
Reindeer Moss Eater ©   (11.03.04 22:08) [84]

Здесь как и до некоторого момента ты подразумевал, что RDM-ы в разных потоках, а Open в одном,

я с этим сгласиться не мог


 
Reindeer Moss Eater ©   (2004-03-17 17:21) [131]

Здесь как и до некоторого момента ты подразумевал, что RDM-ы в разных потоках, а Open в одном,

Чё, все по новой?

Нет в потоках никаких эрдээмов.
Нету, понимаешь, или нет?


 
Reindeer Moss Eater ©   (2004-03-17 17:34) [132]

Главный вывод в посте №84 был подчеркнут.
Только этим могло объясняться поведение сервереа приложений.
А уж сколько потоков там создавали модули данных - пофик.

Ты же берешь, все переворачиваешь задом наперед, и начинаешь с умным видом утверждать, что не бывает такого - несколько потоков создали, а опен вызывается из одного.
Причем сам признал, что технически никаких преград этому нет. Ни малейших.
Вот и все.


 
Dimk   (2004-03-17 17:58) [133]

В C++ Builder создание RDM-ов выглядит совсем не так как в делфи. В глубинах я еще не копался. Но есть различия которые видны невооруженным взглядом:
1. Язык ( шутка )
2. В делфи на ходу создается фабрика классов которая ( если я не забыл ) с помощью TComClassManager.AddObjectFactory...
добавляется в некий список. И потом участвует в создании объекта
от которого запрашивается нужный интерфейс...

В Builder вовсю используются шаблонные классы. Такого как TComponentFactory я не нашел. Даже доступ к членам класса RDM (это косноязычное выражение означает лежащие там TQuery TDatabase поля ...) происходит не просто как RDM.Query.... а нужно обращаться к классу, который ... короче вот код
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
class TTest4 : public TCRemoteDataModule
{
__published:  // IDE-managed Components
       TDatabase *Database1;
       TQuery *Query1;
       TSession *Session1;
       TDataSetProvider *DataSetProvider1;
       void __fastcall CRemoteDataModuleCreate(TObject *Sender);
       void __fastcall CRemoteDataModuleDestroy(TObject *Sender);
private:      // User declarations
public:       // User declarations
 __fastcall TTest4(TComponent* Owner);

__published:
};

/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
extern PACKAGE TTest4 *Test4;

/////////////////////////////////////////////////////////////////////////////
// TTest4Impl     Implements ITest4, default interface of Test4
// ThreadingModel : Apartment
// Dual Interface : TRUE
// Event Support  : FALSE
// Default ProgID : test.Test4
// Description    : Test4
/////////////////////////////////////////////////////////////////////////////
class ATL_NO_VTABLE TTest4Impl: REMOTEDATAMODULE_IMPL(TTest4Impl, Test4, TTest4, ITest4)
{
public:

BEGIN_COM_MAP(TTest4Impl)
 RDMOBJECT_COM_INTERFACE_ENTRIES(ITest4)
END_COM_MAP()

 // Data used when registering Object
 //
 DECLARE_THREADING_MODEL(otApartment);
 DECLARE_PROGID(_T("test.Test4"));
 DECLARE_DESCRIPTION(_T("Test4"));

 // Function invoked to (un)register object
 //
 static HRESULT WINAPI UpdateRegistry(BOOL bRegister)
 {
   TRemoteDataModuleRegistrar regObj(GetObjectCLSID(), GetProgID(), GetDescription());
   // Disable these flags in order to disable use by socket or web connections.
   // Also set other flags to configure the behavior of your application server.
   // For more information, see atlmod.h and atlvcl.cpp.
   regObj.Singleton = false;
   regObj.EnableWeb = true;
   regObj.EnableSocket = true;
   return regObj.UpdateRegistry(bRegister);
 }

// ITest4
protected:
 STDMETHOD(Login(BSTR user, BSTR pass));
 STDMETHOD(ChSQL(BSTR sql));
};

Так вот класс TTest4 (где лежат Query ...) явно не создается
а создается при конструировании TTest4Impl. И чтобы добраться
до Query1 нужна такая конструкция

STDMETHODIMP TTest4Impl::ChSQL(BSTR sql)
{
m_DataModule->Query1->Close();
m_DataModule->Query1->SQL->Text = sql;
m_DataModule->Query1->Open();
return S_OK;
}

Так что выглядит для Delphi-шника оооочень странно.

А где идет само создание COM классов - копаться и копаться.
В выходные покопаюсь... Конечно если те кто делал многозвенные приложения на C++ Builder не подскажут нам темным ... :o)


 
Asdor ©   (2004-03-17 19:40) [134]


> Так что выглядит для Delphi-шника оооочень странно.

Мдя... действительно... а ATL - это вообще жуть. :)
Двухпроходный компилятор и сборка ком-объекта на лету - это конечно круто... только разбираться сложно... :)

Из присланного мне кода пока могу сказать, что можно попробовать решить проблему следующим образом:
#define _ATL_APARTMENT_THREADED
в Test4Impl.h.
Если это не поможет - надо глубже копать в эти в шаблоны...


 
Michail Dalakov ©   (2004-03-17 19:51) [135]

To Reindeer Moss Eater ©   (17.03.04 17:34) [132]
Главный вывод в посте №84 был подчеркнут.
Метод Open у всех датасетов во всех RDM вызывается в одной и той же нити.

Народ подскажите как решить данную проблему, хотелось бы чтобы запросы выполнялись параллельно..(исходный вопрос)

Если это и только это имелось ввиду, то это извини не вывод это - аксиома (часть 1)
Часть вторая это наличие синхронизации потоков, которая может мешать параллельному выполнению


 
Michail Dalakov ©   (2004-03-17 20:00) [136]

To Alexander_K ©
А ты попробуй создать сервер на Delphi и подключись клиентом созданном на Builder-e и на оборот а потом ... копать надо


 
Reindeer Moss Eater ©   (2004-03-17 20:32) [137]

Michail Dalakov ©

Народ подскажите как решить данную проблему, хотелось бы чтобы запросы выполнялись параллельно..(исходный вопрос)

А ты смотрел ответ номер один?
Проблема была локализована еще 135 постов назад.
А ты все : "попробуй муа - муа, попробуй джага-джага"


 
Michail Dalakov ©   (2004-03-17 20:54) [138]

Alexander_K ©   (10.03.04 15:11)  
Народ подскажите как решить данную проблему, хотелось бы чтобы запросы выполнялись параллельно..(исходный вопрос)

А ты смотрел ответ номер один?[137]

Reindeer Moss Eater ©   (10.03.04 15:14) [1]
Что бы запросы выполялись на Оракле параллельно их надо серверу посылать параллельно.
Из разных сессий и подключений. У тебя это есть?


Ну и где же локализация проблемы?
В этом утверждении не видно не то что локализации, здесь нет ни малейшего движения, это констатация аксиомы

Никто же не утверждал, что для того чтобы запросы выполнялись паралельно их надо запускать последовательно из одного подключения


 
Reindeer Moss Eater ©   (2004-03-17 22:13) [139]

Ну и где же локализация проблемы?
В этом утверждении не видно не то что локализации, здесь нет ни малейшего движения, это констатация аксиомы


Боюсь что трудно будет тебе объяснить это.
Раз не замечаешь, что здесь сразу отсекается Оракл как возможный источник проблемы.
Раз не замечаешь, что даны прямые указания на проверку конкретных вещей в сервере приложений.

Попробуй вернуться ко времени поста №1 (к тем исходным данным, что известны на тот момент) и попробуй дать свой ответ.

Никто же не утверждал, что для того чтобы запросы выполнялись паралельно их надо запускать последовательно из одного подключения

Еще раз: не надо брать высказывания, переворачивать их задом наперед, и высасывать из этого мнимые противоречия


 
Michail Dalakov ©   (2004-03-18 09:42) [140]

Попробуй вернуться ко времени поста №1 (к тем исходным данным, что известны на тот момент) и попробуй дать свой ответ.

Michail Dalakov ©   (11.03.04 23:00) [85]
Это первый мой пост, который является не просто констатацией аксиом, а прямым руководством к действию, который сразу все и разрешил, я думаю ты спорить с этим не будешь

На хрена нужна была сотня постов с каким то абсурдом про oracle,
про счетчики RDM и т.д., заметь ты даже в 105 посте делаешь совершенно противоположный вывод

Reindeer Moss Eater ©   (17.03.04 13:12) [105]
Уже сто лет назад было выяснено, что у автора N датамодулей и N ниток.

P.S.
To Reindeer Moss Eater ©  
Любишь ты поспорить, даже на пустом месте у нас с тобой почему то возникает спор, я ценю твое мнение, могу заметить, что я нечасто посещаю форум, но из тех не многих раз когда оказывали помощь посты во многих случаях были твоими,

как сейчас помню пару недель назад, суббота, я около часа выдумывал конструкцию BITAND, первый пост в форум, мгновенное решение и ... непередаваемые эмоции, кстати использование BITAND я и раньше встречал в примерах, но на тот момент вспомнить почему-то не мог, а также на тот момент я не мог понять почему столь необходимая ф-ия недокументирована.

... но с одинаковыми инстанциями баз oracle, ты конечно, меня огорчил, просто взяв и попращавшись, в тот момент я действительно по причинам, которые были выше меня не мог сразу привести параметры обеих инстанций, но если интересно то они действительно оказались полностью идентичными.

... я не хочу приводить множества примеров, в которых твои посты были как всегда полезными, очень эмоциональными, с длительным как всегда спором и т.д., могу заметить, что в своем большинстве это имело какой то толк

Думаю необоснованный спор по данному вопросу следует закончить, ну во-первых жалко времени, во-вторых вряд ли кому-то будет какая-то польза, в-третьих вряд ли кому-то это интересно, в четвертых зачем забивать и без того до предела забитую ветку, в пятых ... и т.д.

"Будете у нас на Колыме ... "

best regards


 
Alexander_K ©   (2004-03-18 10:07) [141]

Asdor ©   (17.03.04 19:40) [134]

Не помогло :(


 
Dimk   (2004-03-18 10:50) [142]

У меня есть предложение к тем у кого есть под рукой
C++ Builder:
Если, конечно, есть время и желание...
Создайте у себя простейший тестовый проектик
как тут уже описывалось, проверьте как у Вас
с параллельностью?
Если вдруг выяснится что у Вас все нормально - надо просто
сравнить проекты Автора и Ваш, если тоже не нормально -
то значит некий глюк на лицо ( или на лице :o) ).

У меня билдера нет под рукой и покопаться с ним смогу не раньше
выходных.

Это бы могло быстрее разрешить загадку :o)


 
Asdor ©   (2004-03-18 10:59) [143]

2 Alexander_K ©   (18.03.04 10:07) [141]

Жаль... :(

Почитай книжку Эндрю Трельсена "Модель COM и применение ATL 3.0".
В ней очень хорошо описана работа с этой библиотекой.

Я читал, но давно, и не могу сейчас вспомнить, какие опции/дефайны надо использовать для того, чтобы заставить работать макрос DECLARE_CLASSFACTORY_AUTO_THREAD (как раз он отвечает за создание фабрики классов, которая создает ком-объекты в отдельных апартментах) при сборке твоих ком-объектов.
Вчера было время - я часа три копался в ATL - не нашел... :( может плохо копался... Сегодня, к сожалению, времени нет...

Кстати, присланный проект у меня не компилился - говорит, нужна другая версия билдера (я себе поставил 5 без патчей).


 
serge35   (2004-03-18 11:03) [144]

Есть еще один вариант.
1.Format c:
2.Установка ОС
3.Устанока Oracle
4.Установка C++ Builder
5.Компиляция проекта
6.Запуск проекта

Если ничего не измениться, то
7.Переписать программу.


 
Dimk   (2004-03-18 11:24) [145]

2 serge35   (18.03.04 11:03) [144]
1. Format c: из под запущенной виндозы не пройдет :o)
2. Попробуй, кстати проверить :o)


 
Reindeer Moss Eater ©   (2004-03-18 11:27) [146]

8. Протереть монитор салфеткой Defender


 
serge35   (2004-03-18 11:29) [147]

Тогда п.0. - Загрузиться с дискеты.
Или с другого винта, желательно в DOCе.
С другого винта даже лучше - можно на всякий
случай сбросить на него исходники.


 
Alexander_K ©   (2004-03-22 11:38) [148]

Ну вроде разобрались.... правда в голове все равно пока каша :)
Правда что бы все работало пришлось править борландовские ошибки в h-файлах :)


 
Alexander_K ©   (2004-03-31 17:03) [149]

Для решения проблемы пришлось дописывать все самим, в C++ Builder это видимо не реализовано. Пришлось написать свою фабрику и TCAppartmentThread.



Страницы: 1 2 3 4 вся ветка

Форум: "Базы";
Текущий архив: 2004.04.25;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.8 MB
Время: 0.048 c
1-1081620253
Liona
2004-04-10 22:04
2004.04.25
Как главную форму положить под все окна приложения?


3-1080447814
Артем К.
2004-03-28 08:23
2004.04.25
Как сохранить в таблицу DB значение вычисляемого поля


1-1081237348
MikePol
2004-04-06 11:42
2004.04.25
"Подвисание" MDI формы


6-1077164853
CASPER
2004-02-19 07:27
2004.04.25
Игра по сети


7-1077726910
Phantomaz
2004-02-25 19:35
2004.04.25
Почему SetWindowsHookEx не пашет, если активно Dos-окно ?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский