线程化DbExpress查询

时间:2009-02-03 11:28:51

标签: multithreading delphi dbexpress

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

所以,

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

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

简单的示例代码(或URL)非常有用。

1 个答案:

答案 0 :(得分:4)

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

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

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

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

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

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

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

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