我只用DbExpress组件在Delphi中完成了“ GUI”数据库访问,但是现在我想在后台执行一个查询。我读了一些TSQLConnection不是线程安全的地方,我必须为每个线程创建新的连接。我看到TSQLConnection中有CloneConnection,但是帮助声称新连接归原始连接所有。
所以,
1)什么是执行位于线程数据模块上的TSQLQuery的正确方法?
2)我可以使用TSQLConnection.CloneConnection吗?我应该释放克隆的连接还是在线程结束时保持不变?
简单的示例代码(或URL)将非常有帮助。
这不是DbExpress特有的(我没有经验),但是将某些功能移入后台线程的最佳方法是首先在主线程中开发它,对其进行调试,一旦确定性能良好,然后移动它。
您可以做的是将所有内容放入TDataModule。如果数据模块能够独立工作,不需要其他表单或数据模块上的其他组件,并且在后台线程中创建它,那么您可以肯定地说一切都会正常。您无需克隆连接,因为它将在执行对数据库的所有访问的同一线程中创建和销毁。
数据库与后台线程一起使用的一些重要提示:
处理所有异常,因为辅助线程中未处理的异常可能会使您的应用程序崩溃。Application对象中的异常处理对您不起作用。
不要在GUI线程中访问任何内容。最重要的是,这意味着TDataSource不可用,并且不能使用对数据敏感的控件。
如果使用的组件对SendMessage或PostMessage进行任何操作,则必须在后台线程中创建标准消息循环。
如果您使用的组件对OLE有任何作用,请在后台线程的上下文中同时调用OleInitialize()和OleUnitialize()。
如果您想使生活更轻松,请考虑使用OmniThreadLibrary或AsyncCalls。哪一个取决于您的后台数据库连接将存活多长时间以及是否要重用它们。