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

Похоже, что 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
05.12.2020, 22:42
    #40024952
Шавлюк Евгений
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FireDAC. Обрыв Firebird 3 Embedded-соединения после 60 секунд после выполнения запроса
nicholaos,

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

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

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


Dimitry Sibiryakov,

В RN написано, что переименовывать не нужно, а не нельзя. Но да - если заменить название библиотеки на fbclient.dll, то ошибки не будет.
...
Рейтинг: 0 / 0
05.12.2020, 23:46
    #40024972
nicholaos
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FireDAC. Обрыв Firebird 3 Embedded-соединения после 60 секунд после выполнения запроса
Хм, немного не так. Переименовать fbclient с удалением исходного файла нельзя - тогда коннект вообще не создается. А вот переименовать копию и оставить fbclient вроде таки можно. Да и работает везде кроме этой комбинации - FireDAC + ХП с on external.
...
Рейтинг: 0 / 0
06.12.2020, 01:26
    #40024988
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FireDAC. Обрыв Firebird 3 Embedded-соединения после 60 секунд после выполнения запроса
Попробуй со свежим снапшотом. Что-то в этой области правилось недавно.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
06.12.2020, 02:22
    #40024994
kdv
kdv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FireDAC. Обрыв Firebird 3 Embedded-соединения после 60 секунд после выполнения запроса
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
06.12.2020, 12:30
    #40025006
nicholaos
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FireDAC. Обрыв Firebird 3 Embedded-соединения после 60 секунд после выполнения запроса
Dimitry Sibiryakov,
Проверил последние снапшоты Firebird-3.0.8.33398 и Firebird-4.0.0.2290 - поведение такое же.

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


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

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

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


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