Firebird事件和防火墙问题(TIBEvents)

时间:2018-04-19 09:55:53

标签: delphi firebird

我将使用带有TIBEvents组件的delphi应用程序Firebird Events的强大功能。

问题是防火墙,并非每次都有正确的角色,当我尝试注册事件时,应用程序停止响应,我必须等待......

我该怎么办?

我也尝试在一个单独的线程中调用寄存器函数,但结果相同。

function RegisterEvents(data : Pointer) : Integer;
begin
  with Form1 do begin
    DBOspitiEvent.Registered := true; 
  end;
end; //<-- AFTER THIS, APPLICATION IS BLOCKED (for a while)

procedure TForm1.Button2Click(Sender: TObject);
var
  ThreadId : Cardinal;
  ThreadHandle : Integer;
begin
  ThreadHandle := BeginThread(nil,0,@RegisterEvents,nil,0,ThreadId);
  if ThreadHandle = 0
    then ShowMessage('Error');
end;

2 个答案:

答案 0 :(得分:4)

对于事件,客户端需要建立单独的连接,默认情况下,Firebird会为此使用随机端口。与防火墙结合使用会导致问题,因为例如,端口是不允许的。

您可以将Firebird配置为使用固定端口,方法是编辑firebird.conf并将RemoteAuxPort设置为固定值(例如3051),然后重新启动Firebird。然后,您可以将防火墙配置为允许此端口。

另见How to configure events with firewall?

答案 1 :(得分:0)

自从XP SP3以来,我们在TIBEvent组件上也遇到了很多问题。
从那以后,即使是使用最新的Win10更新,这对我们来说也算完美:

  • 我们使用UIB接收事件。 TUIBEvents组件。 (您可能会保留IBX的其他功能,但是UIB会变得越来越好,并且与FB3.0兼容。)
  • 不要OnEvent过程中执行任何持久的代码,而应设置多线程安全变量以标记(上次)收到的事件
  • 在每个窗口中本地处理这些变量。 (例如:运行一个计时器,该计时器检查并比较上次事件时间与本地上次刷新时间。)
  • 如果您在单独的线程中运行SQL查询,请始终创建新的数据库+事务组件,请勿使用是主线程中的一个!
  • 在防火墙上打开3050 3051 TCP端口!
  • 我们还将“ fbserver.exe”文件添加到防火墙例外和Defender例外。
  • 在“ firebird.conf”文件中设置固定端口:RemoteServicePort=3050RemoteAuxPort=3051

您可以创建一个FirstInstallScrip.bat文件来进行所有这些防火墙更改,然后将预编辑的.conf文件复制到FB的目录中,从而覆盖原始目录。

是的,您可以从Delphi轻松创建这些简单的文本文件,然后从那里运行它。或通知用户是否尚未运行。 (您可以阅读原始配置文件并比较这些设置。)

    @ECHO program in
    @NETSH advfirewall firewall add rule name="FirebirdSQL szerver" program="%programfiles%\Firebird\Firebird_2_5\bin\fbserver.exe" profile=public,private,domain dir=in action=allow edge=yes description="FirebirdSQL Database engine"

    @ECHO program out
    @NETSH advfirewall firewall add rule name="FirebirdSQL szerver" program="%programfiles%\Firebird\Firebird_2_5\bin\fbserver.exe" profile=public,private,domain dir=out action=allow  description="FirebirdSQL Database engine"

    @ECHO ports in
    @NETSH advfirewall firewall add rule name="FirebirdSQL portok" localport=3050-3051 protocol=tcp profile=public,private,domain dir=in action=allow edge=yes description="FirebirdSQL Database engine ports"

    @ECHO ports out
    @NETSH advfirewall firewall add rule name="FirebirdSQL portok" localport=3050-3051 protocol=tcp profile=public,private,domain dir=out action=allow description="FirebirdSQL Database engine ports"

    @pause

正如@Victoria建议的那样:使用更好的业务逻辑!

  1. 您可以将数据(来自DB的红色)存储在PC的内存中,并从那里显示数据。
  2. 在FB数据库中创建触发器,以自动更新上一次修改。
  3. 请勿删除行,只需将其标记为“已删除”即可。
  4. 仅检查“已更改的内容” SELECT * from "Customers" c where c.MODIFIED > '2019...',并与之前已下载的数据进行比较,以减少SQL负载。
  5. 使用单独的短时事务将数据写入DB。