Как включить WireCompression в Firebird 3.0 с помощью FireDAC

Я хочу подключиться к Firebird Server 3.0 с помощью WireCompression. Это новая функция, начиная с версии 3.0. Мне трудно заставить ее это сделать, и единственная документированная инструкция, которую я могу найти, - это установить для WireCompression значение TRUE в firebird.conf и использовать параметр подключения «wirecompression = true».

Это то, что я получил так далеко:

firebird.conf:

# Firebird configuration file for Firebird 3.0 64-bit SuperServer
# Optimized by IBSurgeon (www.ib-aid.com) for HQbird distribution.
#

ServerMode = Super

#DatabaseAccess = Full
#RemoteAccess = true
#ExternalFileAccess = None
#UdfAccess = Restrict UDF
#TempDirectories =
#AuditTraceConfigFile =
#MaxUserTraceLogSize = 10

DefaultDbCachePages = 50000

#DatabaseGrowthIncrement = 128M
#FileSystemCacheThreshold = 64K
#FileSystemCacheSize = 0
#RemoteFileOpenAbility = 0

TempBlockSize = 2M
TempCacheLimit = 364M

AuthServer = Srp
AuthClient = Srp, Win_Sspi, Legacy_Auth
UserManager = Srp
#WireCryptPlugin = Arc4

#hqbird traceapi plugin should be in plugins folder!
TracePlugin = fbtrace2db

#CryptPlugin = Arc4
#KeyHolderPlugin =
#Providers = Remote,Engine12,Loopback
#DeadlockTimeout = 10
#MaxUnflushedWrites = 100
#MaxUnflushedWriteTime = 5
#BugcheckAbort = 0
#RelaxedAliasChecking = 0
#ConnectionTimeout = 180
#(for client) / Required (for server)

WireCompression = true
WireCrypt = enabled
#DummyPacketInterval = 0
#RemoteServiceName = gds_db

RemoteServicePort = 3050

#RemoteAuxPort = 0
#TcpRemoteBufferSize = 8192
#TcpNoNagle = 1
#RemoteBindAddress =

LockMemSize = 9M

#LockAcquireSpins = 0

LockHashSlots = 30011

#EventMemSize = 64K
#CpuAffinityMask = 0
#GCPolicy = combined
#SecurityDatabase = $(dir_secDb)/security3.fdb

GuardianOption = 1

#ProcessPriorityLevel = 0
#IpcName = FIREBIRD
#RemotePipeName = interbas

Код для подключения:

  //Info: FDB = TFDConnection
  with FDB.Params do
  begin
      Clear;
      Add('DriverID=FB');
      Add('Database=' + vDatabase);
      Add('User_Name=' + AUsername);
      Add('PassWord=' + APassword);
      Add('WireCompression=true');
  end;

  FDB.FetchOptions.Unidirectional:= true;
  FDB.FetchOptions.RowsetSize:= 1000;
  FDB.ResourceOptions.SilentMode:= true;

  FDB.Connected := true;

  vConnectionInfo:= TStringList.Create;
  FDB.GetInfoReport(vConnectionInfo);

  ShowMessage(vConnectionInfo.Text);

  Clipboard.AsText:= vConnectionInfo.Text;

  FreeAndNil(vConnectionInfo);

  Result := FDB.Connected;

Соединение установлено, но vConnectionInfo пишет:

================================
Connection definition parameters
================================
DriverID=FB
Database=server:D:\Databases\FB3.0\test\test.FDB
User_Name=sysdba
PassWord=*****
WireCompression=true
================================
FireDAC info
================================
Tool = RAD Studio 10.1 Berlin
FireDAC = 15.0.1 (Build 86746)
Platform = Windows 32 bit
Defines = FireDAC_NOLOCALE_META;FireDAC_MONITOR
================================
Client info
================================
Loading driver FB ...
Brand = Firebird
Client version = 300009900
Client DLL name = D:\D10\Projects\TestFB30 Client\Win32\Debug\fbclient.dll
================================
Session info
================================
Current catalog = 
Current schema = 
Server version = WI-V3.0.0.32483 Firebird 3.0
WI-V3.0.0.32483 Firebird 3.0/tcp (server)/P13:C
WI-V3.0.0.32483 Firebird 3.0/tcp (laptop)/P13:C

Эти последние две строки говорят, что у меня есть протокол v13 (P13) и данные зашифрованы (: C), но это должно быть P13: CZ, указывающее на сжатие zlib.

у меня есть zlib1.dll в папке отладки на стороне клиента, и zlib1.dll присутствует на сервере в папке сервера Firebird.

Я могу подключиться к базе данных, но нет сообщений об ошибках.

У меня заканчиваются идеи, как применить сжатие, но я верю, что вы, ребята, поможете мне!


person Christiaan ten Klooster    schedule 30.11.2016    source источник
comment
Интересный вопрос, +1. Вы полагаетесь на записи информации о сеансе, чтобы сообщить вам, что сжатие не применяется, или вы подтвердили это с помощью анализатора пакетов?   -  person MartynA    schedule 30.11.2016
comment
В настоящее время я полагаюсь на информацию о сеансе. Я пытался интерпретировать пакеты wireshark, но это не совсем понятно для меня ... я не вижу читаемых данных, возвращаемых из запроса на выборку, но, поскольку они зашифрованы, я полагаю, что это ожидается.   -  person Christiaan ten Klooster    schedule 30.11.2016
comment
Несмотря на то, что пропускная способность значительно увеличилась по сравнению с устаревшей gds32.dll с IBX (5 Мбит/с) и fbclient.dll с FireDAC (50 Мбит/с), я хотел бы использовать сжатие для соединений с высокой задержкой (интернет). Теперь я могу получить 120 000 записей за 6 секунд, что весьма впечатляет, но с сжатием, я думаю, это будет намного больше.   -  person Christiaan ten Klooster    schedule 30.11.2016
comment
Надеюсь, этот вопрос привлечет внимание эксперта по Firebird, которым я не являюсь. Как насчет эмпирического метода проверки того, применяется ли сжатие? Ф.и. используйте запрос, который должен возвращать результат с высокой степенью сжатия, например миллион повторений одного и того же символа, и посмотрите, выглядит ли результирующий сетевой трафик сжатым.   -  person MartynA    schedule 30.11.2016
comment
Что ж, если я уберу WireCompression=true, трафик (и продолжительность извлечения данных, и пропускная способность) и информация о сеансе будут одинаковыми, поэтому я не вижу никакой разницы. Я думаю, это достаточно эмпирически? данные состоят из таблицы клиентов со случайными именами, адресами электронной почты и т. д., поэтому, на мой взгляд, они должны быть очень хорошо сжимаемыми.   -  person Christiaan ten Klooster    schedule 30.11.2016
comment
Пробовали ли вы добавить firebird.conf с WireCompression = True в то же место, что и файл fbclient.dll?   -  person Mark Rotteveel    schedule 30.11.2016
comment
Привет, Марк, не знал, что это вариант :) Это имеет значение, потому что теперь я получаю исключение «Первый шанс» на $ 752BA6F2. Класс исключения EIBNativeException с сообщением «[FireDAC][Phys][FB]Ошибка чтения данных из соединения». Процесс firebird3test.exe (13824)   -  person Christiaan ten Klooster    schedule 30.11.2016
comment
Найденное решение: я скопировал zlib1.dll с сервера, который является x64 после загрузки zlib x86 и размещения его в том же каталоге, в котором он теперь находится. Информация о сеансе ================== ============== Текущий каталог = Текущая схема = Версия сервера = WI-V3.0.0.32483 Firebird 3.0 WI-V3.0.0.32483 Firebird 3.0/tcp (h2402019)/P13:CZ WI-V3.0.0.32483 Firebird 3.0/tcp (ноутбук-Крис)/P13:CZ   -  person Christiaan ten Klooster    schedule 30.11.2016


Ответы (1)


Чтобы включить сжатие zlib с помощью FireDAC, все, что вам нужно сделать, это:

  1. Включите сжатие на стороне сервера с помощью firebird.conf, установив wirecompression=true
  2. Иметь правильную/такую ​​же версию клиентской части fbclient.dll
  3. Поместите правильную zlib1.dll (в моем случае x86) в папку, содержащую клиентский exe
  4. Создайте firebird.conf и добавьте строку wirecompression=true и сохраните ее в той же папке, что и ваш exe.
  5. Добавьте wirecompression=true в параметры соединения

Wirecompression теперь включен.

person Christiaan ten Klooster    schedule 30.11.2016
comment
Пункты 4 и 5 кажутся совершенно излишними. Вам действительно нужно, чтобы было включено сжатие? - person Bozzy; 27.03.2018
comment
Добавление wirecompression=true к connection params ничего не делает, только добавление его к firebird.conf вступает в силу - person Livius; 12.09.2018
comment
Нужны только пункты 3 и 5. WireCompression — это параметр, предназначенный только для клиента, а не для сервера. Но указанный 5-й элемент вводит в заблуждение, поскольку это НЕ параметр FDConnection, и его следует передавать на более низком уровне. Я написал исчерпывающий ответ здесь. - person F.D.Castel; 22.08.2019