- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我只使用 DbExpress 组件在 Delphi 中完成了“GUI”数据库访问,但现在我想在后台执行一个查询。我读到一些 TSQLConnection 不是线程安全的,我必须为每个线程创建新连接。我看到 TSQLConnection 中有 CloneConnection,但帮助声称新连接归原始连接所有。
所以,
1) 执行位于数据模块线程上的 TSQLQuery 的正确方法是什么?
2) 我可以使用 TSQLConnection.CloneConnection 吗?当线程结束时,我应该释放克隆的连接还是保持它们不变?
简单的示例代码(或 URL)会非常有帮助。
最佳答案
这并不是 DbExpress 所特有的(我对此没有经验),但是将某些功能移至后台线程的最佳想法是首先在主线程中开发它,调试它,一旦确定它是表现良好,然后移动它。
您能做的就是将所有内容放入 TDataModule 中。如果数据模块能够独立工作,不需要其他表单或数据模块上的其他组件,并且您在后台线程中创建它,那么您可以相当确定事情会正常工作。您不需要克隆连接,因为它将在执行对数据库的所有访问的同一线程中创建和销毁。
使用后台线程进行数据库工作的一些重要提示:
处理所有异常,因为辅助线程中未处理的异常可能/将会导致应用程序崩溃。 Application 对象中的异常处理对您不起作用。
不要访问 GUI 线程中的任何内容。这意味着最重要的是 TDataSource 不可用,并且不能使用数据敏感控件。
如果您使用的组件对 SendMessage 或 PostMessage 执行任何操作,您将必须在后台线程中创建一个标准消息循环。
如果您使用的组件对 OLE 执行任何操作,请在后台线程的上下文中调用 OleInitialize() 和 OleUnitialize()。
如果您想让生活更轻松,请考虑使用 OmniThreadLibrary或AsyncCalls 。哪一个取决于您的后台数据库连接的生存时间以及您是否要重用它们。
关于multithreading - 线程化 DbExpress 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/506762/
我是一名优秀的程序员,十分优秀!