如何在Firebird 3.0上启用Wirecompression

时间:2018-12-27 00:27:38

标签: delphi firebird firedac firebird-3.0 anydac

我与Firebird和Delphi合作,我想通过有线压缩实现通过Internet的访问; 但是我无法激活它。

我已经按照本文档中的步骤操作了新参数(我能够找到的少数几个参数之一) How to enable WireCompression on Firebird 3.0 using FireDAC

在我使用的测试中 Windows Server 2012 R2 火鸟:Firebird-3.0.4.33054_0_Win32(32 bits) 也复制到可执行文件夹。 fbclient.dll zlib1.dll(同构服务器和客户端) 使用wirecompression = true创建firebird.conf。 并且我在应用程序的Firedac中提供了wirecompression = true。

为什么我无法激活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 :(得分:2)

Mark's answer是整个Internet上关于此问题的最佳(也是唯一的)信息来源。祝您在Delphi,FireDAC或Firebird文档中找到有关他所说内容的任何东西。

根据他的回答,这是将Firebird线压缩与FireDAC一起使用所需要的:

  • 您需要Delphi Rio 10.3.1(更新1)或更高版本。 Only in this version config低级参数(如下所示)已添加到FireDAC。

  • 您必须将WireCompression=true传递给低级别 config连接参数。这不是TFDConnection.Params(高级)。

    • 要实现此目的,您需要将IBAdvanced的{​​{1}}属性设置为TFDPhysFBConnectionDefParams(是的!去计算吧!)

    • 代码:

      config=WireCompression=true
    • 使用connection definition file

      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。这里的问题是Firebird发行版的fbclient.dll文件夹中没有zlib1.dll的32位版本。所以:

    • 如果您的应用程序是64位,则可能还不错。只需使用C:\Program Files\Firebird\Firebird_3_0\WOW64文件夹中的fbclient.dllzlib1.dll

    • 如果您的应用程序是32位,则可以从32位Firebird发行版中to downloadC:\Program Files\Firebird\Firebird_3_0的32位版本。与zlib1.dll(包含32位库)中的fbclient.dll一起使用。

In Firebird 3.0.4 only,您可以使用C:\Program Files\Firebird\Firebird_3_0\WOW64上下文变量来检查是否已按预期建立连接:

WIRE_COMPRESSED

如果当前连接被压缩,它将返回TRUE。

答案 1 :(得分:0)

注意:我不了解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的连接属性。

例如,在使用Jaybird的Java中,您可以使用以下方式启用压缩(仅在使用本机连接时):

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的别名。