Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2013.03.22;
Скачать: CL | DM;

Вниз

Трехзвенка: зависание при одновременном подключении клиентов   Найти похожие ветки 

 
Александр Т ©   (2010-09-17 05:35) [0]

Простая трехзвенка:
[Клиент (TClientDataSet + TSocketConnection)] -> локальная сеть -> [Сервер приложений (TDataSetProvider + IBX)] -> [Firebird]

(Удаленный модуль - instancing: Multiple Instance, threading model: Apartment).

Все компоненты из поставки Delphi5, сервер Firebird v.1.0.3 (довольно-таки старые :)).

При подключении клиента и срабатывании IBDatabase1.Connected := True возникает задержка в зависимости от железа от 1 до 5 сек.
Если во время этой паузы другой клиент пытается подключиться или уже подключенный клиент пытается обратиться к базе, оба намертво зависают.

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

В общем-то проблему решил добавлением глобальной переменной в модуль гл.формы сервера и работой с ней как:

const
 LockedServer: Boolean = False;

procedure TRdmCommon.IBDatabase1BeforeConnect(Sender: TObject);
begin
 if LockedServer then raise Exception.Create("Занят сервер.");
 LockedServer := True;
end;

procedure TRdmCommon.IBDatabase1AfterConnect(Sender: TObject);
begin
 LockedServer := False;
end;

Понятно, что клиенты "готовы" к такому исключению.

Громоздско, но if LockedServer then raise Exception.Create("Занят сервер."); добавил во все процедуры сервера приложений, где есть обращение к базе.

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


 
Александр Т ©   (2010-09-17 11:34) [1]

При замене Threading Model с Apartment-а на Single проблема снялась. А вот почему - черт ее знает :)


 
Александр Т ©   (2010-09-19 08:32) [2]

Респект Роману Игнатьеву за статью "MIDAS - практическое применение". Проблема была не в Apartment-е, а в указании пути к базе. Вместо "Путь..." указать localhost:"Путь..."


 
Loginov Dmitry ©   (2010-09-19 16:34) [3]


> Проблема была не в Apartment-е, а в указании пути к базе.
>  Вместо "Путь..." указать localhost:"Путь..."


Также будет глючить. Может быть чуть пореже, но 100% , что будет.

Нельзя допускать одновременных коннектов к FireBird в рамках одного приложения. Самая простая защита - это поместить код
IBDatabase1.Connected := True;
и соответственно
IBDatabase1.Connected := False;
В критическую секцию.


 
Loginov Dmitry ©   (2010-09-19 16:38) [4]


> При подключении клиента и срабатывании IBDatabase1.Connected
> := True возникает задержка в зависимости от железа от 1
> до 5 сек.


Это слишком большая задержка.
Расширение в имени файла базы данных не GDB случаем? Если так, то его необходимо переименовать (обычно на FDB).
Также можно попробовать обновить FireBird (новые версии вроде как пошустрее).


 
PEAKTOP ©   (2010-09-19 21:54) [5]

> Нельзя допускать одновременных коннектов к FireBird в рамках одного приложения.

Ты где это выкурил ?

Утверждение справедливо только для Firebird Embedded версии ниже 3.0


 
Loginov Dmitry ©   (2010-09-19 22:25) [6]


> Ты где это выкурил ?


Проверил. Опытным путем так сказать.
Выделил для этого время, накатал несколько тестов. Тесты показали соответствующие результаты. С результатами тестов ознакомлены разработчики, а также те, кто регулярно читает соответствующий форум на sql.ru.


> Утверждение справедливо только для Firebird Embedded версии
> ниже 3.0


Утверждение справедливо для ЛЮБЫХ версий FireBird.
С появлением FB2.5 ситуация стала намного лучше. Но тесты показывают, что синхронизация все равно необходима. О том же самом периодически напоминает автор сайта ibase.ru.
Возможно, что дело сейчас даже не в клиентской библиотеке, а в реализации  TIBDatabase.


 
PEAKTOP ©   (2010-09-19 23:56) [7]

Бредятина какая-то.

Одно из моих внедрений - симметричная ERP-система на постоянных 500-800 коннектов уверенно себя чувствует. "Симметричная" потому, что к базе коннектятся не только из клиентского приложения, но она еще имеет веб морду для дилеров на Апаче+ПыХПых. При этом:
1) для сервера все веб коннекты идут от одного приложения (Апача) (порядка 400 штук).
2) клиентское приложение все отчеты на пред.просмотр строит в отдельных тредах, имеющих свое отдельное подключение, чтобы юзер мог в случае тяжелого отчета работать с чем-то другим или просто "передумать".


 
Loginov Dmitry ©   (2010-09-20 00:37) [8]

Мне это ни о чем не говорит. Не указано ни версии FireBird, ни места, где используется TIBDatabase. Что за ПыХПых: это CGI или DLL? Что-то мне подсказывает, что никаких одновременных подключений в параллельных потоках с использованием TIBDatabase в данной системе нет. В таком случае зачем было это приводить, показать как все круто?


 
Александр Т ©   (2010-09-20 03:11) [9]


> Самая простая защита - это поместить код
> IBDatabase1.Connected := True;
> и соответственно
> IBDatabase1.Connected := False;
> В критическую секцию.

А как в случае ошибки грамотнее ее обработать?

Вернуть клиенту с предложением попытаться позже или Sleep на сервере на некоторое время и повторная попытка?
Или же у кого как?


>Расширение в имени файла базы данных не GDB случаем?

Да GDB, конечно. Перелез на с IB на FB, а это как-то упустил :) Спасибо


 
Александр Т ©   (2010-09-20 03:31) [10]


> А как в случае ошибки грамотнее ее обработать?


Прошу прощения, спутал-с CriticalSection с try ...



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

Текущий архив: 2013.03.22;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.064 c
2-1337875870
Den
2012-05-24 20:11
2013.03.22
SetCursorPos не перерисовывает курсор?


15-1353086496
ЕщеОдинКакжеНадоели
2012-11-16 21:21
2013.03.22
Random ный список чисел.


15-1342307267
Германн
2012-07-15 03:07
2013.03.22
Внешний USB-hard drive в качестве системного.


15-1337373003
Юрий
2012-05-19 00:30
2013.03.22
С днем рождения ! 19 мая 2012 суббота


15-1339360203
Юрий
2012-06-11 00:30
2013.03.22
С днем рождения ! 11 июня 2012 понедельник