gpt4 book ai didi

delphi - 如何跟踪服务 Firebird

转载 作者:行者123 更新时间:2023-12-04 10:12:12 25 4
gpt4 key购买 nike

如何使用delphi xe10跟踪服务firebird服务器的所有事件?
这是我的代码:

my := TIBControlService.Create(Self);

my.ServerName := '127.0.0.1/3050';
my.Protocol := TProtocol.TCP;

my.LoginPrompt := false;
my.TraceFlags := [tfQPrepare, tfQExecute, tfQFetch, tfError, tfStmt, tfConnect, tfTransact, tfBlob, tfService, tfMisc];

my.Params.Add( 'user_name=SYSDBA' );
my.Params.Add( 'password=masterkey' );

// -----
mh := MonitorHook;
mh.TraceFlags := my.TraceFlags;

Self.IBSQLMonitor1.TraceFlags := my.TraceFlags;
mh.RegisterMonitor(Self.IBSQLMonitor1);

Self.IBSQLMonitor1.Enabled := true;
Memo1.Lines.Add( Format('GetMonitorCount: %d',[mh.GetMonitorCount]) );


my.Attach;

Memo1.Lines.Add( Format('Active: %s',[System.StrUtils.IfThen(my.Active,'yes','no')]) );


procedure TForm1.IBSQLMonitor1SQL(EventText: string; EventTime: TDateTime);
begin
Memo1.Lines.Add(EventText);
end;

结果:
GetMonitorCount: 1
Active: yes

[Application:]
:[Attach]

[Application:]
:[Query]

但这个结果仅来自我的应用程序。当我从另一个进程(例如 isql)连接时,我的应用程序不显示此事件。

最佳答案

  • 在谈论 Interbase/Firebird 时,术语 事件 具有非常具体的含义,即向订阅这些文本常量的客户发送文本常量的特定 SQL 命令。

    http://firebirdsql.org/file/documentation/reference_manuals/fblangref25-en/html/fblangref25-psql-coding.html#fblangref25-psql-postevent

    但是,客户端应该订阅与 PSQL 块发布的完全相同的文本字符串。有关于启用基于掩码的订阅的讨论,这可能使订阅所有 SQL 事件成为可能,例如 *.*匹配 Windows 中的所有文件,但据我所知,它们从未实现。

    这就是 Firebird 中“事件”的含义,但它似乎不是您的意思,相反,您似乎想要监视 SQL 服务器和所有应用程序之间流动的所有类型的事件,从 SQL 命令等开始。

    如果是这样,那么一般没有办法做到这一点。你必须决定你到底想要什么以及为什么要,也许会有一些 部分 解决方案。
  • Firebird 2.5 引入了所谓的 Trace API,它允许您订阅某些操作并收到通知。不过,这往往会给引擎带来很大的负载,具体取决于订阅过滤器的模糊程度以及服务器收到的请求数量 - 它可能会增加 RAM 和 CPU 使用率,直至完全无法使用。
  • 可以订阅的事件种类是有限的。例如,不监控读取 BLOB 的过程。当我问 - 我正在为由 Delphi dbExpress 库怪癖触发的臭名昭著的“无效 BLOB id”而苦苦挣扎 - 我被告知“从来没有人需要这个,你也没有理由需要它。你做了一个演示项目,将其发送给我们 - 我们为您解释了行为”。那个时候让 BLOB 访问跟踪对我有很大帮助,但客观地说,这是我真正需要它的唯一情况。
  • 您可以看看使用 Firebird Trace Manager 可以获得什么——一个 CLI 实用程序,它是 FB 发行版的一部分,从 2.5 开始。
  • 您可以看看 Firebird Profiler,这是一个来自 http://fbprofiler.sf.net 的免费简单 GUI 工具。
  • Firebird 的商业 DB IDE,如 IBExpert 或 UpScene TraceManager 以及其他可能的工具,通常都有 Trace API 支持。
  • 您可以使用 Trace API 自行实现,从 Program Files\Firebird\Firebird_2_5\doc\README.trace_services.txt 开始和 Program Files\Firebird\Firebird_2_5\include\ibase.h .也可能发生第三方库(如 Unified Interbase 或 IBObjects)已将 API 转换为 Delphi。我想我在 UIB 中看到了一些有关跟踪的信息,但我不确定。我不希望这样的库成为 Delphi 发行版的一部分:从 Delphi 的角度来看,Firebird 是他们 Interbase 的直接竞争对手,而 IBX 库几乎没有兴趣通过支持 Firebird-only 功能来偏离他们自己的 Interbase。
  • 如果您只关心像 Delphi 这样的 native 应用程序,您可能会决定制作自己的中介层 fbclient.dll 并将其安装在所有客户端计算机上而不是库存 DLL 上。与旧版模拟相同 GDS32.DLL ,如果您的应用程序使用。
  • 这个 DLL 应该完全提供所有的 API 调用,都是在 http://firebirdsql.org/en/reference-manuals/ 的 IB6 文档中描述的经典调用。包含所有 IB6 之后的更新,以及新的 Firebird 3“面向对象的 API”。
  • 它应该以您选择的方式记录调用,然后应该将调用代理到原始客户端 DLL 的副本,您将使用不同的文件名为其隐藏该副本。它应该安装在您要拦截和监视的每台计算机上,而不是标准客户端 DLL。
  • 使用经典 API 应该不会很难,人们正在这样做,尽管没有发布。但新的 ooAPI 可能具有挑战性。
  • 它只会拦截应用程序,通过 fbclient.DLL 接口(interface)工作。使用 的 Java 应用程序Jaybird 和 C# 应用程序使用 .Net 提供商 库可能会使用底层连线协议(protocol)跳过 fbclient.dll,从而跳过你的中介层。
  • 关于delphi - 如何跟踪服务 Firebird ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61271433/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com