Как включить проводное сжатие в Firebird 3.0 - PullRequest
0 голосов
/ 27 декабря 2018

Я работаю с Firebird и Delphi, я хочу реализовать доступ через интернет с проводным сжатием;Но я не могу активировать его.

Я выполнил шаги в этом документе для нового параметра (один из немногих, которые мне удалось найти) Как включить WireCompression в Firebird 3.0 с использованием FireDAC

В тестах я использую Windows Server 2012 R2 Firebird: Firebird-3.0.4.33054_0_Win32 (32 бита) Также копируется в исполняемую папку.fbclient.dll zlib1.dll (сервер и клиент idem) создал firebird.conf со значением wirecompression = true.и я даю wirecompression = true внутри Firedac приложения.

Почему я не могу активировать сжатие P15: CZ?

Sending connection info for the example:
================================
Connection definition parameters
================================
DriverID=FB
Database=miservidor001:C:\sysdat\C100\gestdat03.fdb
User_Name=SYSDBA
PassWord=*****
WireCompression=true
================================
FireDAC info
================================
Tool = RAD Studio 10.2
FireDAC = 16.0.0 (Build 88974)
Platform = Windows 32 bit
Defines = FireDAC_NOLOCALE_META;FireDAC_MONITOR
================================
Client info
================================
Loading driver FB ...
Brand = Firebird
Client version = 300049900
Client DLL name = C:\APPS\WC01\fbclient.dll
================================
Session info
================================
Current catalog = 
Current schema = 
Server version = WI-V3.0.4.33054 Firebird 3.0
WI-V3.0.4.33054 Firebird 3.0/tcp (WIN-2012LAGO003)/P15:C
WI-V3.0.4.33054 Firebird 3.0/tcp (nucleo)/P15:C'

Ответы [ 2 ]

0 голосов
/ 22 августа 2019

Ответ Марка - лучший (и, вероятно, единственный) источник информации об этой проблеме во всем Интернете.Удачи вам найти что-нибудь в документации Delphi, FireDAC или Firebird о том, что он сказал.

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

  • Требуется Delphi Rio 10.3.1 (обновление 1) или более поздняя версия. Только в этой версии параметр низкого уровня config (см. Ниже) был добавлен в FireDAC.

  • Вы должны передать WireCompression=true в низкий Уровень config Параметр подключения.Это НЕ TFDConnection.Params (высокий уровень).

    • Для этого вам нужно установить для свойства IBAdvanced TFDPhysFBConnectionDefParams значение config=WireCompression=true (да!)

    • Код:

      FDConnection1.DriverName := '​FB';
      with FDConnection1.Params as TFDPhysFBConnectionDefParams do   
      begin
        Server := '...';
        Database := '...';
        UserName := '...';
        Password := '...';
        IBAdvanced := 'config=WireCompression=true';
      end;
      FDConnection1.Connected := True;
      
    • Использование файла определения соединения :

      [FB_Demo]
      DriverID=FB
      Server=...
      Database=...
      User_Name=...
      Password=...
      IBAdvanced=config=WireCompression=true
      
  • Вам нужно zlib1.dll на том же пути, что и ваш fbclient.dll.Подвох в том, что дистрибутив Firebird НЕ имеет 32-битной версии zlib1.dll в папке C:\Program Files\Firebird\Firebird_3_0\WOW64.Итак:

    • Если ваше приложение 64-битное , вы, вероятно, в порядке.Просто используйте fbclient.dll и zlib1.dll из папки C:\Program Files\Firebird\Firebird_3_0.

    • Если ваше приложение 32-битное , у вас есть для загрузки 32-битная версия zlib1.dll из 32-битного дистрибутива Firebird.Используйте его вместе с fbclient.dll, который вы найдете в вашем C:\Program Files\Firebird\Firebird_3_0\WOW64 (который содержит 32-битные библиотеки).

В Firebird 3.0.4только вы можете использовать контекстную переменную WIRE_COMPRESSED, чтобы проверить, было ли установлено соединение, как вы ожидали:

SELECT
  RDB$GET_CONTEXT('SYSTEM', 'WIRE_COMPRESSED') wire_compressed
FROM
  rdb$database

Это вернет TRUE, если текущее соединение сжато.

0 голосов
/ 28 декабря 2018

ПРИМЕЧАНИЕ. Я не знаю ни Delphi, ни FireDAC, этот ответ основан на общем поведении Firebird и моем опыте поддержки его драйвера JDBC (Jaybird).Поэтому вполне возможно, что есть лучший ответ специально для FireDAC / Delphi.

Включение или отключение проводного сжатия полностью определяется клиентом, а не сервером.Это означает, что настройка сервера не является необходимой и не оказывает никакого влияния, за исключением случаев, когда сам сервер выступает в роли клиента, например, с execute statement ... on external datasource.

Чтобы использовать сжатие по проводам, вынужно три вещи:

  1. fbclient.dll
  2. zlib1.dll (в том же месте, что и fbclient.dll или в пути поиска)
  3. Конфигурация длявключить сжатие проводов для клиента

Вероятно, проблема в точке 3: я не уверен, что у FireDAC есть свойство подключения WireCompression, которое фактически включает сжатие проводов.

Я знаюиз двух способов включить сжатие проводов для клиента:

  1. Создайте firebird.conf в том же каталоге, что и fbclient.dll, используемый вашим приложением.В этот файл конфигурации поместите запрошенные параметры конфигурации (по одному на строку):

    WireCompression = true
    # maybe other config lines (eg AuthClient, WireCrypt, etc)
    
  2. Вместо создания файла firebird.conf передайте конфигурацию (с разрывами строк, разделяющими параметры конфигурации)в элементе параметра базы данных isc_dpb_config (int 87).

    Значение совпадает с содержимым файла firebird.conf в предыдущем параметре.Это может привести к проблемам с размером, если клиент использует старый формат буфера параметров базы данных (где строки имеют максимальный размер 255 байт), и вы хотите передать (много) больше параметров конфигурации.

Вариант 1, вероятно, самый простой и будет работать для всех платформ.Вариант 2 зависит от того, предоставляет ли каркас или драйвер буфер параметров базы данных или если у него есть свойство подключения, которое отображается на isc_dpb_config.

Например, в Java с использованием Jaybird вы можете включить сжатие (только когдаиспользуя собственные соединения) с помощью:

Properties props = new Properties();
props.setProperty("user", "sysdba");
props.setProperty("password", "masterkey");
props.setProperty("config", "WireCompression=true");

try (var connection = DriverManager.getConnection(
        "jdbc:firebirdsql:native:localhost:D:/data/db/fb3/fb3testdatabase.fdb", props)) {

    FirebirdConnection fbCon = connection.unwrap(FirebirdConnection.class);
    FbDatabase fbDatabase = fbCon.getFbDatabase();
    System.out.println(fbDatabase.getServerVersion());

} catch (SQLException e) {
    e.printStackTrace();
}

Выводится WI-V3.0.4.33054 Firebird 3.0,WI-V3.0.4.33054 Firebird 3.0/tcp (host)/P15:CZ,WI-V3.0.4.33054 Firebird 3.0/tcp (host)/P15:CZ (обратите внимание, это <server version>,<server protocol info>,<client protocol info>)

Здесь свойство config является псевдонимом для isc_dpb_config.

...