Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
 Проблемы с использованием FireDAC - незапланированный Shutdown при Backup'е  [new]
Nick74
Member

Откуда:
Сообщений: 215
Приложение на Delphi 10.2 (64bit) использует Firebird embedded (3.0+) в качестве базы данных.
Используется компонента TFDIBBackup для создания бекапа (Пробовал также TFDFBNBackup - у нее формат файлов другой, но проблема ровно та же).

Проблема: ровно через минуту после успешного создания бекапа (База небольшая и бекап занимает секунду, файл тоже корректный и его можно скормить процедуре восстановления БД) в файле firebird.log каталога приложения появляется строка "Shutting down the server with 1 active connection(s) to 1 database(s), 0 active service(s)", после чего любое действие в приложении вызывает ошибку "Database shutdown".

Со стороны приложения (Если ничего не делать) в этот момент никаких ошибок не возникает, Connection активен.
Connection и не закрываю при создании Backup.

Пытаюсь понять: это глюк компоненты бекапа, или это какая-то хитрая механика Firebird (хотя зачем делать shutdown после backup - ума не приложу).

Проблема №2 здесь же - без fbclient.dll программа просто не работает, пишет что-то про инициализацию engine12. Бекап-компонента же для работы в Embedded режиме требует, чтобы VendorLib назывался fbembed.dll. Две одинаковые ДЛЛ-ки - не то, чтобы мешает, но сам факт странный.
25 янв 21, 10:55    [22268686]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы с использованием FireDAC - незапланированный Shutdown при Backup'е  [new]
kdv
Member

Откуда: iBase.ru
Сообщений: 29547
Nick74
Бекап-компонента же для работы в Embedded режиме требует

я не силен в FireDAC, но вообще-то компоненты не могут "требовать" чего-то там в отношении Embedded, потому что у Firebird режим Embedded обеспечивается самим сервером. Приложение понятия не имеет, embedded это или нет, разница только в строке коннекта. А строка коннекта компонентам тоже до лампочки.
25 янв 21, 11:17    [22268705]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы с использованием FireDAC - незапланированный Shutdown при Backup'е  [new]
Nick74
Member

Откуда:
Сообщений: 215
kdv,
"требуют" в смысле не работают, если указать fbclient.dll. Ошибка "Unable to complete network request to host "xnet://Global\FIREBIRD"

Подозреваю, что работает вот этот кусочек из TIBLib.GetLibraryInfo
  if Pos('FIREBIRD', sProd) <> 0 then begin
    FBrand := ibFirebird;
    FEmbedded := Pos('embed', sLib) > 0;
  end

ну и далее в TIBService.Attach
        if (Lib.Brand = ibFirebird) and (Lib.Version >= ivFB030000) and not Lib.FEmbedded then
          sProt := 'xnet://'

Значение галочки Embedded в DriverLink, я так понимаю, игнорируется.
25 янв 21, 11:50    [22268732]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы с использованием FireDAC - незапланированный Shutdown при Backup'е  [new]
kdv
Member

Откуда: iBase.ru
Сообщений: 29547
Nick74,

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

Вообще, нахрена этот код - мне непонятно. У FB 1.5-2.5 fbembed.dll назывался клиент с вкомпилированным сервером. Имя было изменено только для того чтобы отличать обычный fbclient.dll от аналогичного fbclient.dll с вкомпилированным сервером.
Никаких других отличий для приложения больше не было.
У ФБ 3 embedded устроен по другому. там fbclient.dll в случае embedded-коннекта (без имени сервера) сам подгружает engine12.dll, т.е. движок сервера. Соответственно, переименования клиентской либы не только не нужны (они никогда и не были нужны), но и наоборот, "ломают систему".

В общем оба эти куска надо переделывать. Вопрос, зачем FireDAC-у вообще проперть FEmbedded.
25 янв 21, 12:16    [22268757]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы с использованием FireDAC - незапланированный Shutdown при Backup'е  [new]
kdv
Member

Откуда: iBase.ru
Сообщений: 29547
где же господин Арефьев? :-)
25 янв 21, 12:55    [22268777]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы с использованием FireDAC - незапланированный Shutdown при Backup'е  [new]
alekcvp
Member

Откуда:
Сообщений: 2730
kdv
Nick74,
господи, вот это ... шляпа. xnet://

'xnet://Global\FIREBIRD' - это стандартная подстановка FireDAC'а, когда он не понимает чего от него хотят.

Сообщение было отредактировано: 25 янв 21, 14:07
25 янв 21, 14:13    [22268840]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы с использованием FireDAC - незапланированный Shutdown при Backup'е  [new]
Nick74
Member

Откуда:
Сообщений: 215
kdv
Вопрос, зачем FireDAC-у вообще проперть FEmbedded.

Про последнее могу сказать - по последним изысканиям если не указать название ДЛЛ-ки вообще, то он сам подставляет fbclient, если нет галочки, и fbembed если есть. Но IBLib определяет "ембеднутость" исключительно по названию библиотеки, невзирая на галочку. Поэтому и fbclient с галочкой Embedded рассматривается все равно как не-embedded.
25 янв 21, 14:41    [22268872]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы с использованием FireDAC - незапланированный Shutdown при Backup'е  [new]
Nick74
Member

Откуда:
Сообщений: 215
Может у меня версия FireDac какая-то старая, проверьте плиз есть у вас вообще такое в FirуDAC.Phys.IBWrapper.
Покупалось оно года 3 назад, надо отметить.
25 янв 21, 14:52    [22268895]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы с использованием FireDAC - незапланированный Shutdown при Backup'е  [new]
kdv
Member

Откуда: iBase.ru
Сообщений: 29547
alekcvp
'xnet://Global\FIREBIRD' - это стандартная подстановка FireDAC'а, когда он не понимает чего от него хотят.

чего только люди не придумают...

Строка коннекта в IB и FB должна содержать имя сервера, порт, или протокол, и полный путь к файлу БД с именем файла.
То есть, ни в isc_attach_database, ни в attachDatabase OO API Firebird 3 нет никакого разделения строки коннекта на отдельные части.
Всякие поля "протокол", "имя сервера", "имя БД"- это придумки авторов компонент и инструментов.
Видимо, отсюда возникает идея "подстановок", хотя, неясно, с какого фига. Если я не указал имя сервера и протокол, почему в случае НЕэмбеддед должно быть xnet? А если я хочу embedded?

Собственно, "оглашаю весь список":
Connection Strings in Firebird 3
https://www.ibphoenix.com/files/ConnectionStrings_Fb3.pdf
расписано всё, включая эмбеддед, шмембеддед и прочее.

Причем, теоретически я бы понял этот xnet, в отношении людей, которые в среде Дельфи пытаются работать с Embedded
(о геморройности чего я регулярно вещаю).
Но ведь
"Where embedded is not available, a hostless connection could be established using the Loopback provider, in which case full login credentials would need to be present. On Windows, the provider will try to use XNET (see below) to make the local connection and, failing that, a localhost connection via TCP/IP or, on Windows, via WNET (see below)."

То есть, оно само, если embedded "недоступен". А если он должен быть, но недоступен, так зачем искривлять строку коннекта до xnet?
Ну пытаюсь я голым fbclient.dll открыть базу "c:\dir\data.fdb". так я сам дурак, наверное. к чему сюда xnet-то лепить, "авось законнектится"???
25 янв 21, 16:34    [22269025]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы с использованием FireDAC - незапланированный Shutdown при Backup'е  [new]
kdv
Member

Откуда: iBase.ru
Сообщений: 29547
Nick74,

я умолкаю, ждем или Арефьева или людей с кодом FireDac.
25 янв 21, 18:02    [22269086]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы с использованием FireDAC - незапланированный Shutdown при Backup'е  [new]
Nick74
Member

Откуда:
Сообщений: 215
Проверил на delphi 10.4 - с тех времен ничего не изменилось, ошибка та же.

Выложил архив с проектом Delphi с примером ошибки. Запустить, подождать минуту до появления ошибки.
Компилировалось под Delphi 10.4.
Обвязка для Embedded клиента в каталоге win64/release взята из дистрибутива FB 3.0.7
База данных test.fdb там же - подойдет любая база, я взял security.fdb из дистрибутива FB, ничего мельче под рукой не нашлось.
Exe-шник тоже прикладываю для тех, кому лень компилировать.
Собственно всего текста программы меньше страницы.

https://dropmefiles.com/n603T (Файл будет доступен 2 недели от текущего момента)

P.S. Кстати, при компиляции под 10.4 отказался работать компонент TFDIBBackup с ошибкой Invalid clumped buffer structure, вроде бы даже нашел Work around от Арефьева про SizeOf(Byte), но в сорсах Firedac уже стоит SizeOf(Word), ну да не в этом суть, у меня все равно купленный 10.2

Сообщение было отредактировано: 25 янв 21, 18:47
25 янв 21, 18:45    [22269112]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы с использованием FireDAC - незапланированный Shutdown при Backup'е  [new]
Nick74
Member

Откуда:
Сообщений: 215
Подтверждено, что проблема именно из-за двух разных DLL.
Бекап-компоненты для работы в Embedded-режиме требуют fbembed.dll, а компоненты доступа - fbclient.dll.
Если в TIBLib.GetLibraryInfo поправить
  if Pos('FIREBIRD', sProd) <> 0 then begin
    FBrand := ibFirebird;
    FEmbedded := Pos('embed', sLib) > 0;
  end

на
  if Pos('FIREBIRD', sProd) <> 0 then begin
    FBrand := ibFirebird;
    FEmbedded := true; //Pos('embed', sLib) > 0;
  end

и вписать fbclient.dll в LibName в компоненте драйвера, то ошибка исчезает.
Ну правда и компонента, подозреваю, не будет работать с полноценным сервером, но в Embedded режиме все работает без проблем.
Корректное для всех случаев изменение оставляю авторам FD, ибо не очень понимаю как правильно получить свойство компоненты драйвера Embedded в TIBLib.
2 фев 21, 14:07    [22273235]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы с использованием FireDAC - незапланированный Shutdown при Backup'е  [new]
kdv
Member

Откуда: iBase.ru
Сообщений: 29547
Nick74,

я уже предлагал посмотреть код FireDAC, на предмет "за каким" там вообще существует свойство FEmbedded.
Напомню, что для клиентского приложения нет никакой разницы, embedded или нет, и какая архитектура на сервере - superserver, superclassic, или classic.
Embedded начинает работать только тогда, когда строка коннекта к БД не содержит имени сервера. И никто не запрещал в 2.5 переименовать fbembed.dll в fbclient.dll.
4 фев 21, 16:56    [22274919]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы с использованием FireDAC - незапланированный Shutdown при Backup'е  [new]
alekcvp
Member

Откуда:
Сообщений: 2730
kdv
Nick74,
я уже предлагал посмотреть код FireDAC, на предмет "за каким" там вообще существует свойство FEmbedded.
Dmitry Arefiev
Embedded=True - будет попытка загрузить fbembed.dll, потом fbclient.dll. Если False - в обратном порядке.
4 фев 21, 21:51    [22275154]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы с использованием FireDAC - незапланированный Shutdown при Backup'е  [new]
Vlad F
Member

Откуда:
Сообщений: 1342
Dmitry Arefiev
Embedded=True - будет попытка загрузить fbembed.dll, потом fbclient.dll. Если False - в обратном порядке.

Тогда он тем более не должен выставляться автоматически в каких-либо обработчиках, а только вручную, осознанно.
Поставьте, наконец телегу и лошадь в нужном порядке. Причем все это для версии ниже тройки, в ней Embedded mode конфигурируется вообще снаружи (есть опыт с FireDAC).
5 фев 21, 00:00    [22275190]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы с использованием FireDAC - незапланированный Shutdown при Backup'е  [new]
kdv
Member

Откуда: iBase.ru
Сообщений: 29547
alekcvp
Embedded=True - будет попытка загрузить fbembed.dll, потом fbclient.dll. Если False - в обратном порядке.

это вообще чудовищная левизна. Которая к embedded не имеет никакого отношения.
Допустим, у меня есть программа, которая работает И с ИБ, и с ФБ. И она должна искать gds32.dll или fbclient.dll.
Что она еще должна пытаться искать fbembed.dll я просто не смог додуматься. Просто потому что я в курсе, почему эти dll имеют такие названия.
Поскольку переход с 2.5 на 3.0 уже явно происходит, этот ахтунг надо срочно убирать. Либо, НИКОГДА не включать это самое свойство Embedded в FireDAC.
5 фев 21, 16:54    [22275803]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы с использованием FireDAC - незапланированный Shutdown при Backup'е  [new]
alekcvp
Member

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

Допустим, у меня есть программа, которая работает И с ИБ, и с ФБ. И она должна искать gds32.dll или fbclient.dll.

Это свойства линка для FB, для IB там другой линк, насколько я понимаю.
5 фев 21, 17:14    [22275829]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы с использованием FireDAC - незапланированный Shutdown при Backup'е  [new]
Nick74
Member

Откуда:
Сообщений: 215
kdv
Либо, НИКОГДА не включать это самое свойство Embedded в FireDAC.

Если Embedded=false, то компонента дописывает xnet://... к пути, и без установленного полноценного сервера FB бекап в этом случае выдает ошибку.
Вернее не так, Embedded линка действительно влияет только на имя библиотеки. Но для TIBLib есть свой собственный FEmbedded, который не связан с Embedded линка и определяется исключительно по названию библиотеки. И если использовать fbclient, то бекап не работает без сервера. А если не использовать, то бекап работает. Но через минуту глушит коннект к базе данных.
Текст ошибки и фрагменты сорс кода см. ранее в топике.

Сообщение было отредактировано: 18 фев 21, 14:46
18 фев 21, 14:46    [22282846]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы с использованием FireDAC - незапланированный Shutdown при Backup'е  [new]
Мимопроходящий
Member

Откуда: бурятский тундрюк, эсквайр
Сообщений: 31969

18.02.2021 14:46, Nick74 пишет:
> Если Embedded=false, то компонента дописывает xnet://... к пути, и без установленного полноценного сервера FB бекап в этом случае выдает ошибку.
> Вернее не так, Embedded линка действительно влияет только на имя библиотеки. Но для TIBLib есть свой собственный FEmbedded, который не связан с Embedded линка и определяется исключительно по названию библиотеки. И если использовать fbclient, то бекап не работает без сервера.

ну и на кой черт вам эта контуженная прокладка в лице FireDAC?

Posted via ActualForum NNTP Server 1.5

18 фев 21, 14:55    [22282860]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы с использованием FireDAC - незапланированный Shutdown при Backup'е  [new]
энди
Member

Откуда: Киров, Россия
Сообщений: 1200
она бесплатная и отлично работает под андроид, чего не скажешь по unidac
18 фев 21, 15:37    [22282915]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы с использованием FireDAC - незапланированный Shutdown при Backup'е  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 12572
энди
она бесплатная и отлично работает под андроид, чего не скажешь по unidac
Вам намекают, что нужно использовать родное API, а компоненты выкинуть. Для создание бэкапа нужно вызвать пару функций из fbclient
18 фев 21, 15:58    [22282933]     Ответить | Цитировать Сообщить модератору
Все форумы / Delphi Ответить