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

Вниз

Разделение подключения к БД   Найти похожие ветки 

 
AlexanderSK   (2004-01-23 13:20) [0]

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

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


 
Romkin ©   (2004-01-23 13:26) [1]

Возможно. Но все они должны быть в одном потоке :)


 
Johnmen ©   (2004-01-23 13:27) [2]

Нет.


 
AlexanderSK   (2004-01-23 13:31) [3]

А если использовать TIBTransaction?


 
Anatoly Podgoretsky ©   (2004-03-03 17:46) [4]

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


 
AlexanderSK   (2004-03-03 17:49) [5]

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


 
Johnmen ©   (2004-03-03 17:50) [6]

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


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

Да!
:)


 
Romkin ©   (2004-03-03 17:54) [8]

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


 
AlexanderSK   (2004-03-03 17:59) [9]

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


 
Romkin ©   (2004-03-03 18:03) [10]

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


 
AlexanderSK   (2004-03-03 18:04) [11]

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

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:06) [12]

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


 
AlexanderSK   (2004-03-03 18:08) [13]

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


 
Romkin ©   (2004-03-03 18:15) [14]

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


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

Пишем так:

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

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


 
Zacho ©   (2004-03-04 12:02) [16]

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


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

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


 
Zacho ©   (2004-03-04 12:12) [18]

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


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

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


 
Zacho ©   (2004-03-04 12:26) [20]

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


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

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


 
Zacho ©   (2004-03-04 12:37) [22]

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


 
Desdechado ©   (2004-03-04 15:11) [23]

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



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

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

Наверх




Память: 0.52 MB
Время: 0.025 c
14-1078577675
Julia
2004-03-06 15:54
2004.04.04
Объявление


3-1078219576
senya
2004-03-02 12:26
2004.04.04
как использовать транзакции с ADO ?


14-1078398784
LaidBack
2004-03-04 14:13
2004.04.04
Ушла...


3-1078414564
ceval
2004-03-04 18:36
2004.04.04
отображения хода открытия сделал Animate


14-1078095046
m_a_r_t
2004-03-01 01:50
2004.04.04
Художественная книга на английском языке