【问题标题】:Run Firebird query in a background thread and save result set在后台线程中运行 Firebird 查询并保存结果集
【发布时间】:2023-03-14 18:00:01
【问题描述】:

我想将带有参数的查询的执行放入 delphi-2009 中的线程安全类中。

我在 google 中导航,但没有找到我想要的。

谢谢

【问题讨论】:

    标签: windows multithreading delphi delphi-2009 firebird


    【解决方案1】:

    我发现大多数数据库 API 仅在连接级别是线程安全的。 Firebird 可能有所不同,但在数年(8 多年)前使用 InterBase,它不是线程安全的。更新:I have verified Firebird is only thread safe at the connection level.

    这意味着您通常需要避免同时使用来自多个线程的单个连接。对给定连接执行查询适用。 避免在不同线程中针对同一连接运行两个查询。

    但是,话虽如此,如果您有两个连接,则可以同时运行两个查询。

    您的问题的本质似乎是如何以安全的方式将数据传递给线程,尽管您的特定需求是数据库,但这以通用方式适用,无论线程中包含什么。

    传递数据最简单的方法是在创建时,您可以创建暂停的线程,在您的TThread 后代上设置各种属性。然后恢复线程的执行。 您在线程中执行工作的实际代码需要从 Execute() 方法中调用。

    如果您需要在线程之间共享数据,您必须包装在允许同步的各种结构之一中,例如临界区、互斥体或信号量。

    Delphi 在 SyncObjs.pas 单元中为每一个都提供了库包装器。

    【讨论】:

    • +1 对于我的一个项目,我正在广泛使用它(后台线程中的查询)。但是我不需要将实际的查询对象从一个线程传递到下一个线程,并且我在每个线程中使用一对 DbConnection + Transaction。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多