我将使用带有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;
答案 0 :(得分:4)
对于事件,客户端需要建立单独的连接,默认情况下,Firebird会为此使用随机端口。与防火墙结合使用会导致问题,因为例如,端口是不允许的。
您可以将Firebird配置为使用固定端口,方法是编辑firebird.conf并将RemoteAuxPort
设置为固定值(例如3051),然后重新启动Firebird。然后,您可以将防火墙配置为允许此端口。
答案 1 :(得分:0)
自从XP SP3以来,我们在TIBEvent
组件上也遇到了很多问题。
从那以后,即使是使用最新的Win10更新,这对我们来说也算完美:
TUIBEvents
组件。 (您可能会保留IBX的其他功能,但是UIB会变得越来越好,并且与FB3.0兼容。) OnEvent
过程中执行任何持久的代码,而应设置多线程安全变量以标记(上次)收到的事件RemoteServicePort=3050
和RemoteAuxPort=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建议的那样:使用更好的业务逻辑!
SELECT * from "Customers" c where c.MODIFIED > '2019...'
,并与之前已下载的数据进行比较,以减少SQL负载。