![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Разделение подключения к БД [D6, IB6.x]
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]
:-)