Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Разделение подключения к БД [D6, IB6.x]


Страницы:   1 2

AlexanderSK ©   (2004-01-23 13:20:00) 

Подскажите, пожалуйсиа, возможно ли выполнять несколько запросов к БД одновременно через одино подключение - TIBDatabase?

Заранее спасибо!


Desdechado   (2004-03-04 15:11:00) [1]

в доках явно написано currently client is not thread safe


Zacho   (2004-03-04 12:37:00) [2]

В данном случае - объективные.
Вот тебе обоснование: так устроена клиентская библиотека IB.
Поэтому общее правило: одно подключение - один поток. Или организуй критические секции и т.п. Но все равно - в контексте одного подключения паралельно запросы выполняться не будут.


AlexanderSK   (2004-03-04 12:29:00) [3]

>Zacho ©  (04.03.04 12:26)
Чтобы обосновать и доказать эти самы правильно и не правильно?
P.S. Правильность и неправильность - кактегории субъективные!


Zacho   (2004-03-04 12:26:00) [4]

Некогда мне сейчас примеры придумывать.
Ну нафига это тебе ?  Тебе сказали как сделать правильно, нет ты упорствуешь и продолжаешь делать неправильно. Зачем ? Что бы услышать кучу матов после сдачи проекта в эксплуатацию ?


AlexanderSK   (2004-03-04 12:15:00) [5]

"Вобщем-то, случайно, что работает. Сейчас работает - завтра перестанет" - это снова не ответ! у меня есть пример который работает! как он должен выглядеть чтобы сразу НЕ работать?


Zacho   (2004-03-04 12:12:00) [6]

Тебе уже Romkin отвечал. Вобщем-то, случайно, что работает. Сейчас работает - завтра перестанет.
И вообще, ты уверен, что тебе надо выполнять запросы из разных потоков в контексте одного подключения ? Все равно "паралельно" они выполнятся не будут. Только последовательно.


AlexanderSK   (2004-03-04 12:05:00) [7]

>Zacho ©  (04.03.04 12:02) [16]
На мой ызгляд, это не ответ на вопрос на заланный вопрос - "почему так работает?"


Zacho   (2004-03-04 12:02:00) [8]

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


AlexanderSK   (2004-03-04 11:53:00) [9]

Пишем так:

procedure Test.Execute;
var
 i: Integer;
begin
 T := TIBTransaction.Create(nil);
 T.DefaultDatabase := Main.IBD;
 T.Active := True;
 Q := TIBQuery.Create(nil);
 Q.Transaction := T;
 Randomize;
 if Main.DS1.DataSet = nil then Main.DS1.DataSet := Q
 else if Main.DS2.DataSet = nil then Main.DS2.DataSet := Q
 else if Main.DS3.DataSet = nil then Main.DS3.DataSet := Q;
 while True do
 begin
   if Self.Terminated then Break;
   T.Commit;
   Q.Active := False;
   Q.SQL.Clear;
   I := Random(4);
   I := 0;
   case i of
   0: Q.SQL.Add('Select * From RAS_Get_Spec');
   1: Q.SQL.Add('Select * From RAS_Get_Prof');
   2: Q.SQL.Add('Select * From Professions');
   3: Q.SQL.Add('Select * From Directions');
   end;
   T.StartTransaction;    
   Q.Active := True;
 end;
 Q.Active := False;
 Q.Transaction := nil;
 Q.Free;
end

Все работает!


Romkin   (2004-03-03 18:15:00) [10]

И что? Ты же постоянно берешь данные из одной таблицы в одной транзакции. Пересечение есть, но перекрывается. Шаг вправо-влево - клиент IB тебя расстреляет


AlexanderSK   (2004-03-03 18:08:00) [11]

т.е. "когда пересечешься - поймешь"?
Этот код работал в течение 15 минут непрерывно!


Romkin   (2004-03-03 18:06:00) [12]

А ничего удивительного. Вот когда пересечешься - поймешь


AlexanderSK   (2004-03-03 18:04:00) [13]

А теперь самое интересное!

Main - Основная форма приложения.
IBD: TIBDatabase;
IBT: TIBTransaction;

IBD, IBT - расположены на Main.

Далее создаем код нитки:

type
 Test = class(TThread)
 private
   Q: TIBQuery;

...

procedure Test.Execute;
var
 i: Integer;
begin
 Q := TIBQuery.Create(nil);
 Randomize;
 Q.Database := Main.IBD;
 while True do
 begin
   if Self.Terminated then Break;
   Q.Active := False;
   Q.SQL.Clear;
   I := Random(4);
   I := 0;
   case i of
   0: Q.SQL.Add('Select * From T1');
   1: Q.SQL.Add('Select * From T2');
   2: Q.SQL.Add('Select * From T3');
   3: Q.SQL.Add('Select * From T4');
   end;
   Q.Active := True;
 end;
 Q.Active := False;
 Q.Free;
end;

Запускаем 3 таких нити одновременно - все работает!
Вот ПОЧЕМУ - это для меня загадка.....


Romkin   (2004-03-03 18:03:00) [14]

Много - это сколько? Много ты все равно не сделаешь, памяти на компоненты доступа к БД не хватит


AlexanderSK   (2004-03-03 17:59:00) [15]

Из [потоков] может быть много (очень)!


Romkin   (2004-03-03 17:54:00) [16]

У тебя IB6.0? у него же unlimited users. Что стоит подключаться из каждого потока отдельно?


AlexanderSK   (2004-03-03 17:52:00) [17]

Да!
:)


Johnmen   (2004-03-03 17:50:00) [18]

А из одного уже получилось ?
:)


AlexanderSK   (2004-03-03 17:49:00) [19]

ОК!
Подскжите, пожалуйста, как реализовать доступ к БД из разных потоков через одно соединение с БД - TIBDatabase?


Anatoly Podgoretsky   (2004-03-03 17:46:00) [20]

Romkin ©   (23.01.04 13:26) [1]
:-)


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо