首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >线程化DbExpress查询

线程化DbExpress查询
EN

Stack Overflow用户
提问于 2009-02-03 11:28:51
回答 1查看 2.4K关注 0票数 4

我只用DbExpress组件在Delphi语言中做过“图形用户界面”的数据库访问,但现在我想在后台执行一个查询。我读到了一些TSQLConnection不安全线程情况,我必须为每个线程创建新的连接。我看到TSQLConnection中有CloneConnection,但help声称新连接归原始连接所有。

所以,

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

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

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2009-02-03 12:00:32

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

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

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

  • 处理所有异常,因为辅助线程中未处理的异常可能/将使您的应用程序崩溃。应用程序对象中的异常处理对您无效。
  • 不访问GUI线程中的任何内容。这意味着最重要的是TDataSource不可用,并且不能使用数据敏感控件。
  • 如果您使用的组件使用SendMessage或PostMessage执行任何操作,则必须在后台线程中创建标准消息循环。
  • 如果您使用的组件使用OLE执行任何操作,请在后台线程的上下文中调用OleInitialize()和OleUnitialize()。

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

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/506762

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档