Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Firebird, InterBase Новый топик    Ответить
Топик располагается на нескольких страницах: 1 2      [все]
 Уточнение о многопоточности  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 11913
Есть один общий коннект.

В каждом потоке создается своя транзакция и свой TIBSQL.

Будет работать? Или переписывать все на разные коннекты?


С уважением, Vasilisk
18 июн 20, 18:04    [22153114]     Ответить | Цитировать Сообщить модератору
 Re: Уточнение о многопоточности  [new]
Симонов Денис
Member

Откуда: Рязань
Сообщений: 10574
_Vasilisk_,

не будет. Истинная многопоточность возможна только в разных коннектах.

Если нужны ещё и общие согласованные данные, то это пока только в 4.0, там есть shared snapshot для транзакции
18 июн 20, 18:17    [22153121]     Ответить | Цитировать Сообщить модератору
 Re: Уточнение о многопоточности  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 50346
_Vasilisk_
Будет работать?

Падать не должно. Но и толку нет.

PS: И, раз уж речь зашла, какое API лучше: асинхронное или многопоточное?

Сообщение было отредактировано: 18 июн 20, 18:21
18 июн 20, 18:22    [22153124]     Ответить | Цитировать Сообщить модератору
 Re: Уточнение о многопоточности  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 11913
Dimitry Sibiryakov
Падать не должно.
Т.е. синхронизация в fbclient есть?
Dimitry Sibiryakov
Но и толку нет.
Толк особо не нужен. Из разных потоков выполняются мини-запросы. Если они выстроятся все в очередь, это будет не критично
18 июн 20, 18:25    [22153126]     Ответить | Цитировать Сообщить модератору
 Re: Уточнение о многопоточности  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 11913
Симонов Денис
Истинная многопоточность возможна только в разных коннектах.
Истинная многопоточность не нужна. Нужна стабильность работы и уверенность, что я не полезу к общим данным без синхронизации
18 июн 20, 18:29    [22153129]     Ответить | Цитировать Сообщить модератору
 Re: Уточнение о многопоточности  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 50346

_Vasilisk_
Т.е. синхронизация в fbclient есть?

Да, на уровне коннекта.

Posted via ActualForum NNTP Server 1.5

18 июн 20, 18:31    [22153131]     Ответить | Цитировать Сообщить модератору
 Re: Уточнение о многопоточности  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 11913
Dimitry Sibiryakov
Да, на уровне коннекта.
Спасибо
18 июн 20, 18:40    [22153139]     Ответить | Цитировать Сообщить модератору
 Re: Уточнение о многопоточности  [new]
DmSer
Member

Откуда: Пенза
Сообщений: 1105
_Vasilisk_
Симонов Денис
Истинная многопоточность возможна только в разных коннектах.
Истинная многопоточность не нужна. Нужна стабильность работы и уверенность, что я не полезу к общим данным без синхронизации


В ibx с этим есть проблемы, поэтому нежелательно лишний раз дёргать ibdatabase из разных потоков.
18 июн 20, 19:17    [22153168]     Ответить | Цитировать Сообщить модератору
 Re: Уточнение о многопоточности  [new]
kdv
Member

Откуда: iBase.ru
Сообщений: 28878
_Vasilisk_
Из разных потоков выполняются мини-запросы. Если они выстроятся все в очередь

перефразируя, получается
"многотредовость без многопоточности это как настоящая многопоточность, только без многопоточности".
Ради прикола можно написать такой код. Только его эффективность будет равна нулю - что с тредами, что без, всё равно будет очередь.
Если это попытка освободить gui от зависания во время выполнения запросов - ну, можно.
Или, с прицелом на будущую выдачу своего коннекта каждому треду.
18 июн 20, 20:11    [22153213]     Ответить | Цитировать Сообщить модератору
 Re: Уточнение о многопоточности  [new]
DmSer
Member

Откуда: Пенза
Сообщений: 1105
Если используете ibx, то почему бы не задействовать пул из ibxFbUtils?
18 июн 20, 20:38    [22153228]     Ответить | Цитировать Сообщить модератору
 Re: Уточнение о многопоточности  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 11913
kdv
Или, с прицелом на будущую выдачу своего коннекта каждому треду.
Изначально это все работало на Interbase и каждый новый поток получал свой коннект. Потом в очередной версии Borland/Codegear ужесточили лицензионную политику и в одной лицензии стали разрешать не более пяти коннектов. Поэтому пришлось пересматривать многопоточную модель и все свелось к одному коннекту, но потоки так и остались. Сейчас мы мигрировали (наконец) на Firebird и в одном месте программа стала работать странно. Вот и решил уточниться.

А так, конечно, нужно возвращать мультисессионность.
DmSer
почему бы не задействовать пул из ibxFbUtils?
Это что за зверь? Что-то самописное? Идея пула коннектов уже бродит. Думал писать свой велосипед
22 июн 20, 14:12    [22155145]     Ответить | Цитировать Сообщить модератору
 Re: Уточнение о многопоточности  [new]
kdv
Member

Откуда: iBase.ru
Сообщений: 28878
_Vasilisk_
ужесточили лицензионную политику и в одной лицензии стали разрешать не более пяти коннектов.

не пяти, а четырех, причем это относится к клиентской лицензии (на сервере), но никаких физических ограничений при этом нет.
Допустим, лицензия на 5 клиентов = 20 коннектов. Хоть с одного компа.
Понятно, что если приложение невозбранно жрет коннекты, то они быстро кончатся для других пользователей.

При переходе на Firebird и возврате "многоконнектной многопоточности" в приложении, нужно учитывать архитектуру сервера.
На классике/суперклассике бесконтрольное открытие коннектов приложениями приводит к пожиранию памяти сервером.
22 июн 20, 14:19    [22155158]     Ответить | Цитировать Сообщить модератору
 Re: Уточнение о многопоточности  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 11913
kdv
не пяти, а четырех,
С тобой спорить не буду, но кажется мне, что было таки 5. Или там было 4 на лицензию плюс 1 на сервер. Уже не помню
kdv
это относится к клиентской лицензии (на сервере), но никаких физических ограничений при этом нет. Допустим, лицензия на 5 клиентов = 20 коннектов. Хоть с одного компа.
Это я все знаю
kdv
На классике/суперклассике бесконтрольное открытие коннектов приложениями приводит к пожиранию памяти сервером.
Ну не бесконтрольное. В среднем получится до 10 коннектов. Ну и понятно, что чем больше хотим от сервера, тем больше сервер хочет от нас :)
22 июн 20, 14:29    [22155168]     Ответить | Цитировать Сообщить модератору
 Re: Уточнение о многопоточности  [new]
Vlad F
Member

Откуда:
Сообщений: 1295
_Vasilisk_

DmSer
почему бы не задействовать пул из ibxFbUtils?
Это что за зверь? Что-то самописное? Идея пула коннектов уже бродит. Думал писать свой велосипед

Думаю, что в IBX надо смотреть на IBX.IBConnectionBroker.pas:
http://docwiki.embarcadero.com/Libraries/Rio/en/IBX.IBConnectionBroker.TIBConnectionBroker
22 июн 20, 15:18    [22155188]     Ответить | Цитировать Сообщить модератору
 Re: Уточнение о многопоточности  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 11913
Vlad F
Думаю, что в IBX надо смотреть на IBX.IBConnectionBroker.pas:
Да. Это он и есть. Спасибо.

P.S. А код страшненький
+
function TIBConnectionBroker.GetConnection: TIBDatabase;
var
  gotOne: Boolean;
  OuterLoop: Integer;
  aloop: Integer;
  roundrobin: Integer;
begin
  result := nil;
  gotOne := false;
  for outerloop := 0 to 2 do
  begin
    try
      aloop := 0;
      roundRobin := FConnLast + 1;
      if (roundRobin >= FCurrConnections) then
        roundRobin := 0;
      CS1.BeginWrite;
      try
        repeat
          begin
            begin
              if (FConnPool[roundRobin].ConnStatus < 1) then
              begin
                if (FConnPool[roundRobin].Database.Connected) then
                begin
                  result := FConnPool[roundRobin].Database;
                  FConnPool[roundRobin].ConnStatus := 1;
                  FConnPool[roundRobin].ConnLockTime := now;
                  FConnLast := roundRobin;
                  gotOne := true;
                  DoLog(SIBBrokerGiveOut + IntToStr(roundrobin));
                  break;
                end;
              end
              else
              begin
                inc(aloop);
                inc(roundRobin);
                if (roundRobin >= FCurrConnections) then
                  roundRobin := 0;
              end;
            end;
          end;
        until ((gotOne = true) or (aloop >= FCurrConnections));
      finally
        CS1.EndWrite;
      end;
    except
      ///
    end;

    if (gotOne) then
    begin
      break;
    end
    else
    begin
      CS1.BeginWrite;
      try
        begin // Add new connections to the pool
          if (FCurrConnections < FMaxConns) then
          begin
            try
              CreateConn(FCurrConnections);
              Inc(FCurrConnections);
            except
              on E: Exception do
                DoLog(SIBBrokerUnavailable + e.Message );
            end;
          end;

          sleep(FDelay);
          DoLog(SIBBrokerExhausted + IntToStr(outerloop));
        end;
      finally
        CS1.EndWrite;
      end;
    end; // End of try 10 times loop
  end;
end;
22 июн 20, 15:28    [22155199]     Ответить | Цитировать Сообщить модератору
 Re: Уточнение о многопоточности  [new]
Vlad F
Member

Откуда:
Сообщений: 1295
_Vasilisk_,

Он там везде страшненький. Перспективнее смотреть в сторону FireDAC.
22 июн 20, 15:44    [22155208]     Ответить | Цитировать Сообщить модератору
 Re: Уточнение о многопоточности  [new]
kdv
Member

Откуда: iBase.ru
Сообщений: 28878
_Vasilisk_
Или там было 4 на лицензию плюс 1 на сервер. Уже не помню

не было никаких "плюс" или "пять". Я абсолютно точно говорю - 4 коннекта на юзерскую лицензию.
Да, серверная лицензия включает одну юзерскую (если это не пакет сервер+клиенты), иначе к серверу было бы невозможно подключиться. Но это значит - 4 коннекта (1 юзер).
Если докупить 5 юзерских лицензий, получится 1+5 = 6 лицензий * 4 коннекта = 24 коннекта.
У десктопной лицензии - всегда 2 юзера, т.е. 2х4=8 коннектов.
И т.д. Со мной спорить в этом плане не надо, я 2 года был консультантом Борланда по InterBase. :-) И продаю лицензии InterBase с 1997 по настоящий момент.
22 июн 20, 18:01    [22155337]     Ответить | Цитировать Сообщить модератору
 Re: Уточнение о многопоточности  [new]
DmSer
Member

Откуда: Пенза
Сообщений: 1105
_Vasilisk_
kdv
Или, с прицелом на будущую выдачу своего коннекта каждому треду.
Изначально это все работало на Interbase и каждый новый поток получал свой коннект. Потом в очередной версии Borland/Codegear ужесточили лицензионную политику и в одной лицензии стали разрешать не более пяти коннектов. Поэтому пришлось пересматривать многопоточную модель и все свелось к одному коннекту, но потоки так и остались. Сейчас мы мигрировали (наконец) на Firebird и в одном месте программа стала работать странно. Вот и решил уточниться.

А так, конечно, нужно возвращать мультисессионность.
DmSer
почему бы не задействовать пул из ibxFbUtils?
Это что за зверь? Что-то самописное? Идея пула коннектов уже бродит. Думал писать свой велосипед


ссылка на обсуждение. Исходники на sf.net, также ссылка там есть. На той неделе последний раз коммит делал. Основное преимущество- надёжность. Что с этим у брокера- не в курсе.
23 июн 20, 08:22    [22155678]     Ответить | Цитировать Сообщить модератору
 Re: Уточнение о многопоточности  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 11913
DmSer
Основное преимущество- надёжность.
fbUtils.pas
{$IFDEF WIN64}
КОМПОНЕНТЫ IBX НЕ МОГУТ РАБОТАТЬ С БД FIREBIRD В 64-РАЗРЯДНОМ ПРИЛОЖЕНИИ!
{$ENDIF}
Дальше не читал. В топку.

Сообщение было отредактировано: 23 июн 20, 13:15
23 июн 20, 13:18    [22155926]     Ответить | Цитировать Сообщить модератору
 Re: Уточнение о многопоточности  [new]
DmSer
Member

Откуда: Пенза
Сообщений: 1105
_Vasilisk_
DmSer
Основное преимущество- надёжность.
fbUtils.pas
{$IFDEF WIN64}
КОМПОНЕНТЫ IBX НЕ МОГУТ РАБОТАТЬ С БД FIREBIRD В 64-РАЗРЯДНОМ ПРИЛОЖЕНИИ!
{$ENDIF}
Дальше не читал. В топку.


А разве это неправда? В 2012 году не работали. Сейчас что изменилось?
23 июн 20, 13:50    [22155965]     Ответить | Цитировать Сообщить модератору
 Re: Уточнение о многопоточности  [new]
Basil A. Sidorov
Member

Откуда:
Сообщений: 10264
DmSer
В 2012 году не работали
... потому, что кто-то пытался загрузить библиотеки 32-разрядного сервера?
23 июн 20, 13:53    [22155972]     Ответить | Цитировать Сообщить модератору
 Re: Уточнение о многопоточности  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 11913
DmSer
Сейчас что изменилось?
IBX отлично подтягивает непереименованный 64 битный fbclient и замечательно с ним работает
Basil A. Sidorov
... потому, что кто-то пытался загрузить библиотеки 32-разрядного сервера?
Кстати, так и не понял логику разработчиков, которые оставили имя fbclient.dll для 64 битной версии
23 июн 20, 13:59    [22155982]     Ответить | Цитировать Сообщить модератору
 Re: Уточнение о многопоточности  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 50346

_Vasilisk_
так и не понял логику разработчиков, которые оставили имя fbclient.dll для 64 битной версии

Возможно, они не захотели напрягать рядовых коллег условной компиляцией. В makefile это
особенно неприятно.

Поэтому схема проста: либо ты кладёшь в каталог приложения библиотеку нужной лично ему
разрядности, либо устанавливаешь библиотеку в системный каталог и нужную разрядность
автомагически подсунет система.

Posted via ActualForum NNTP Server 1.5

23 июн 20, 14:09    [22155993]     Ответить | Цитировать Сообщить модератору
 Re: Уточнение о многопоточности  [new]
DmSer
Member

Откуда: Пенза
Сообщений: 1105
Basil A. Sidorov
DmSer
В 2012 году не работали
... потому, что кто-то пытался загрузить библиотеки 32-разрядного сервера?


Точно не помню, как я проверял в 2012 году, мог и ошибиться.
Получается, если я скопирую fbclient.dll под именем GDS32.dll (или дам команду инсталл клиент) и кину в папку с программой, то IBXксы должны заработать?
23 июн 20, 15:02    [22156053]     Ответить | Цитировать Сообщить модератору
 Re: Уточнение о многопоточности  [new]
kdv
Member

Откуда: iBase.ru
Сообщений: 28878
DmSer
скопирую fbclient.dll под именем GDS32.dll

если тебе пофиг на services api. у фбклиента версия либы меньше 6, а по этой версии ибх определяет видимость services api.
instclient.exe как раз превращает фбклиент в правильный гдс32. Правда, не знаю, делает-ли то же самое 64разрядный instclient.
23 июн 20, 15:08    [22156060]     Ответить | Цитировать Сообщить модератору
 Re: Уточнение о многопоточности  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 50346

kdv
если тебе пофиг на services api.

Точнее - если тебе пофиг на соответствующие компоненты в палитре. Именно их видимость
определяется по версии.

Posted via ActualForum NNTP Server 1.5

23 июн 20, 15:11    [22156063]     Ответить | Цитировать Сообщить модератору
 Re: Уточнение о многопоточности  [new]
DmSer
Member

Откуда: Пенза
Сообщений: 1105
Dimitry Sibiryakov

kdv
если тебе пофиг на services api.

Точнее - если тебе пофиг на соответствующие компоненты в палитре. Именно их видимость
определяется по версии.


Мне кажется, это ближе к истине. У нас в системе тупо переименованный fbclient.dll и никогда не было проблем с Service API (в смысле, бэкапы и ресторы без проблем всегда работали). А вот лежат ли на палитре эти компоненты - не помню. Не задумывался.
23 июн 20, 15:17    [22156067]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: 1 2      [все]
Все форумы / Firebird, InterBase Ответить