powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / FireDAC. Обрыв Firebird 3 Embedded-соединения после 60 секунд после выполнения запроса
11 сообщений из 11, страница 1 из 1
FireDAC. Обрыв Firebird 3 Embedded-соединения после 60 секунд после выполнения запроса
    #40024941
nicholaos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте!

Похоже, что FireDAC разрывает соединение с Firebird 3 в Embedded-режиме, если была выполнена хранимая процедура с выражением on external.

Удалось сделать "минимальный" пример.

Что я сделал:
1. Скачал Firebird-3.0.7.33374-1_Win32.zip и распаковал
2. Через isql cоздал пароль для SYSDBA, создал пользователя TUSER, создал от его имени 2 базы.
команды создания баз
create database "C:\Work\FiredacBug\TESTDB1.FDB" user TUSER password 'test';
commit;

create database "C:\Work\FiredacBug\TESTDB2.FDB" user TUSER password 'test';
commit;

3. Настроил databases.conf.
databases.conf
TESTDB1=C:\Work\FiredacBug\TESTDB1.FDB
TESTDB2=C:\Work\FiredacBug\TESTDB2.FDB

4. Настроил firebird.conf для работы в Embedded.
firebird.conf
Providers = Engine12
ServerMode = SuperClassic

5. Создал хранимую процедуру (через isql, от пользователя TUSER) в TESTDB1, которая обращается к TESTDB2.
команда создания ХП
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
set term ^ ;

create or alter procedure test_proc
returns (res varchar(30))
as
begin
  execute statement 'select ''1'' from rdb$database'
  on external 'TESTDB2'
  as user 'TUSER' password 'test'
  into :res;
  suspend;
end^

set term ; ^



select * from test_proc; отрабатывает как положено - возвращает 1.


6. Создал копию fbclient.dll, назвал fbembed.dll - такую библиотеку будет искать реальный клиент (раньше работал с FB 2.5).

Подготовка завершена, теперь сам пример.

7. Создаю новый проект в Delphi, компиляция - в папку в распакованным Firebird. Кидаю на форму TFDConnection, TFDPhysFBDriverLink, два TFDQuery и TButton.
8. Создаю обработчик - соединение с TESTDB1 и вызов test_proc.
Button1Click
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
procedure TForm1.Button1Click(Sender: TObject);
begin
  FDPhysFBDriverLink1.Embedded := True;
  FDPhysFBDriverLink1.VendorLib := 'fbembed.dll';
  FDPhysFBDriverLink1.DriverID := 'FB';
  FDConnection1.DriverName := 'FB';
  FDConnection1.Params.Database := 'TESTDB1';
  FDConnection1.Params.UserName := 'TUSER';
  FDConnection1.Params.Password := 'test';
  FDConnection1.LoginPrompt := False;
  FDQuery1.Connection := FDConnection1;
  FDQuery2.Connection := FDConnection1;
  FDConnection1.Open;

  FDQuery1.SQL.SetText('select * from test_proc');
  FDQuery1.Open;
  ShowMessage(FDQuery1.Fields[0].AsString);
  FDQuery1.Close;
  FDConnection1.Close;
end;




Пока все хорошо - соединение создается, единичка возвращается.

7. Добавляю любой другой запрос к TESTDB1 (FDQuery2) в цикле. По наблюдениям в программе разрыв происходит не сразу, так что выполняю запросы с интервалом в 1 секунду.
Button1Click
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
procedure TForm1.Button1Click(Sender: TObject);
var
  i: integer;
begin
  FDPhysFBDriverLink1.Embedded := True;
  FDPhysFBDriverLink1.VendorLib := 'fbembed.dll';
  FDPhysFBDriverLink1.DriverID := 'FB';
  FDConnection1.DriverName := 'FB';
  FDConnection1.Params.Database := 'TESTDB1';
  FDConnection1.Params.UserName := 'TUSER';
  FDConnection1.Params.Password := 'test';
  FDConnection1.LoginPrompt := False;
  FDQuery1.Connection := FDConnection1;
  FDQuery2.Connection := FDConnection1;
  FDConnection1.Open;

  FDQuery1.SQL.SetText('select * from test_proc');
  FDQuery1.Open;
  FDQuery1.Close;

  try
    i := 0;
    repeat
      FDQuery2.SQL.SetText('select * from rdb$database');
      FDQuery2.Open;
      FDQuery2.Close;
      Sleep(1000);
      inc(i);
    until False;
  except
    on E: Exception do
      ShowMessage('i = ' + i.ToString + ' E.Message = ' + E.Message);
  end;
  FDConnection1.Close;
end;




8. Получаю shutdown connection по истечении 60-ти секунд.
Текст ошибки



В call stack что-то странное - падает на TIBTransaction.StartTransaction в FireDAC.Phys.IBWrapper. При этом StartTransaction предыдущих 59-ти вызовов проходил успешно.
Стэк вызовов




Реальный пример гораздо сложнее, но смысл приблизительно такой же.

Вопрос - я что-то в настройке Embedded-соединения сделал не так? Или в Embedded нельзя использовать on external? Или это баг в FireDAC? Проверял в Delphi 10.2.3 и Delphi 10.4.1 - поведение одинаковое.

Папку с Firebird, базами и проектом выложил на Я.Диск: https://yadi.sk/d/Yydzw9AfSyWG9w
...
Рейтинг: 0 / 0
FireDAC. Обрыв Firebird 3 Embedded-соединения после 60 секунд после выполнения запроса
    #40024952
Шавлюк Евгений
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nicholaos,

А что если промоделировать ситуацию в IBExpert/isql?
...
Рейтинг: 0 / 0
FireDAC. Обрыв Firebird 3 Embedded-соединения после 60 секунд после выполнения запроса
    #40024956
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nicholaosСоздал копию fbclient.dll, назвал fbembed.dll - такую библиотеку будет искать реальный
клиент (раньше работал с FB 2.5).

С тройкой так делать нельзя. Поменяй имя библиотеки в ДАКе.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
FireDAC. Обрыв Firebird 3 Embedded-соединения после 60 секунд после выполнения запроса
    #40024966
nicholaos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Шавлюк Евгений,

не воспроизводится. Насколько я знаю, IBExpert использует FIB, а не FireDAC. Я тестировал еще компоненты IB (переименовывал в ibtogo.dll) - на них ошибки нет.


Dimitry Sibiryakov,

В RN написано, что переименовывать не нужно, а не нельзя. Но да - если заменить название библиотеки на fbclient.dll, то ошибки не будет.
...
Рейтинг: 0 / 0
FireDAC. Обрыв Firebird 3 Embedded-соединения после 60 секунд после выполнения запроса
    #40024972
nicholaos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Хм, немного не так. Переименовать fbclient с удалением исходного файла нельзя - тогда коннект вообще не создается. А вот переименовать копию и оставить fbclient вроде таки можно. Да и работает везде кроме этой комбинации - FireDAC + ХП с on external.
...
Рейтинг: 0 / 0
FireDAC. Обрыв Firebird 3 Embedded-соединения после 60 секунд после выполнения запроса
    #40024988
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Попробуй со свежим снапшотом. Что-то в этой области правилось недавно.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
FireDAC. Обрыв Firebird 3 Embedded-соединения после 60 секунд после выполнения запроса
    #40024994
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nicholaos,

в 3.0 для embedded не надо ничего переименовывать. И вообще, наоборот - в 2.5 fbembed.dll надо было переименовывать в fbclient. Потому что это были 2 разные либы, и в fbembed.dll был и клиент и сервер, а по умолчанию программы использовали даже не fbclient.dll, а чаще gds32.dll. А в 3.0 в fbclient никакого сервера нет, поэтому переименовывать ее в fbembed бессмыслено.
nicholaosесли заменить название библиотеки на fbclient.dll, то ошибки не будет.
так что, проблема решена?

p.s. вообще проверять сначала надо на обычном сервере. А уже потом пробовать embedded. И в 3.0 для этого, в общем-то, надо только вырубить сервер и указать fbclient.dll из корня установки сервера. Ну и чтобы в данном случае битность сервера соответствовала битности приложения.
...
Рейтинг: 0 / 0
FireDAC. Обрыв Firebird 3 Embedded-соединения после 60 секунд после выполнения запроса
    #40025006
nicholaos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov,
Проверил последние снапшоты Firebird-3.0.8.33398 и Firebird-4.0.0.2290 - поведение такое же.

kdv
nicholaos,
так что, проблема решена?


Да. Нужно будет только найти все обращения к fbembed.dll.
...
Рейтинг: 0 / 0
FireDAC. Обрыв Firebird 3 Embedded-соединения после 60 секунд после выполнения запроса
    #40025013
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nicholaosПроверил последние снапшоты Firebird-3.0.8.33398 и Firebird-4.0.0.2290 - поведение такое же.

Значит пиши в трекер, мол "переименованный fbclient.dll выгружает не свои провайдеры".
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
FireDAC. Обрыв Firebird 3 Embedded-соединения после 60 секунд после выполнения запроса
    #40025016
nicholaos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov,

Я до сих пор виню FireDAC, а не Firebird. Тот же пример с другими компонентами-то не падает.
...
Рейтинг: 0 / 0
FireDAC. Обрыв Firebird 3 Embedded-соединения после 60 секунд после выполнения запроса
    #40025020
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nicholaosНужно будет только найти все обращения к fbembed.dll.
чего уж проще. удаляем все fbembed.dll, и всё :-)
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / FireDAC. Обрыв Firebird 3 Embedded-соединения после 60 секунд после выполнения запроса
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]