Форум: "Базы";
Текущий архив: 2004.04.04;
Скачать: [xml.tar.bz2];
Вниз
Разделение подключения к БД Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.048 c