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

Вниз

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

 
Александр Т ©   (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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.47 MB
Время: 0.065 c
1-1295243133
Xmen
2011-01-17 08:45
2013.03.22
сохранение Word файла в Blob поле


15-1352536128
alexdn
2012-11-10 12:28
2013.03.22
asp.net


2-1340776149
mpdasa
2012-06-27 09:49
2013.03.22
Как вставлять текст в (rich)edit с задержкой времени


2-1340180219
vasa777
2012-06-20 12:16
2013.03.22
число записей при sql запросе


2-1330341115
agent17
2012-02-27 15:11
2013.03.22
TDateTime





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский