Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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
1-1079433269
Rem
2004-03-16 13:34
2004.04.04
Русские шрифты в Formula One Ver. 3.0.4


3-1078787526
Soldier
2004-03-09 02:12
2004.04.04
Помогие чайнику с базой Paradox


4-1074922175
Lefan
2004-01-24 08:29
2004.04.04
Перехват кликов мыши....


6-1074868075
Sound
2004-01-23 17:27
2004.04.04
Как очистить папку History?


3-1078497021
mops
2004-03-05 17:30
2004.04.04
Порушилась база???





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