【问题标题】:Threading DbExpress queries线程化 DbExpress 查询
【发布时间】:2009-02-03 11:28:50
【问题描述】:

我只在 Delphi 中使用 DbExpress 组件完成了“GUI”数据库访问,但现在我想在后台执行一个查询。我读了一些 TSQLConnection 不是线程安全的,我必须为每个线程创建新连接。我看到 TSQLConnection 中有 CloneConnection,但是 help 声称新连接归原始连接所有。

所以,

1) 执行位于线程数据模块上的 TSQLQuery 的正确方法是什么?

2) 我可以使用 TSQLConnection.CloneConnection 吗?我应该释放克隆的连接还是在线程结束时保持不变?

简单的示例代码(或 URL)会很有帮助。

【问题讨论】:

    标签: multithreading delphi dbexpress


    【解决方案1】:

    这不是 DbExpress 特有的(我没有这方面的经验),但是将某些功能移到后台线程的最佳想法是首先在主线程中开发它,调试它,一旦你确定它是表现良好,然后移动它。

    你可以做的就是把所有的东西都放到一个 TDataModule 上。如果数据模块能够独立工作,不需要其他表单或数据模块上的其他组件,并且您在后台线程中创建它,那么您可以相当确定事情会正常工作。您不需要克隆连接,因为它将在执行所有数据库访问的同一线程中创建和销毁。

    数据库使用后台线程的一些重要提示:

    • 处理所有异常,因为辅助线程中未处理的异常可能/将使您的应用程序崩溃。 Application 对象中的异常处理对您不起作用。

    • 不要访问 GUI 线程中的任何内容。这意味着最重要的是 TDataSource 不可用,并且不能使用任何数据敏感控件。

    • 如果您使用的组件对 SendMessage 或 PostMessage 执行任何操作,您将必须在后台线程中创建标准消息循环。

    • 如果您使用的组件对 OLE 执行任何操作,请在后台线程的上下文中调用 OleInitialize() 和 OleUnitialize()。

    如果您想让您的生活更轻松,请考虑使用OmniThreadLibraryAsyncCalls。哪一个取决于您的后台数据库连接将存在多长时间以及您是否要重用它们。

    【讨论】:

    • 当前解决方案的最大问题是我有多个相互依赖的数据模块(连接在另一个数据模块中,而不是查询)。但我会看看我是否可以改进它。
    • 我并不是说你应该完全以这种方式实现它,只是设计一个可行的解决方案和调试它会容易得多。你当然可以简单地保留你现在拥有的东西,并创建一个新的数据模块,专为在后台线程中使用而设计。
    猜你喜欢
    • 2023-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多