4

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

所以,

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

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

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

4

1 回答 1

5

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

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

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

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

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

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

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

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

于 2009-02-03T12:00:32.077 回答