【发布时间】:2012-03-09 20:40:42
【问题描述】:
我正在我的应用程序中实现同步方法。它将执行的主要步骤是:
- 从远程站点获取 XML 内容
- 使用 IXMLDomDocument2 解析此 XML
- 更新 Firebird 数据库
逻辑相当复杂,但它本身运行良好。
问题是当我尝试在单独的线程中运行它时。我很清楚,我的逻辑没有正确获得线程安全。
所以让我们切片吧
I - 使用 TidHTTP
获取内容没有任何问题,我应该在这里有什么顾虑吗?
II - 对于 IXMLDomDocument2 我正在调用
CoInitializeEx(nil, 0);
根据the documentation 应该足以安全地使用IXMLDomDocument2。它似乎没问题,添加后我尝试使用它时没有收到任何错误。这里有什么额外的问题吗?
III - 安全使用 Firebird
我的问题在这里。有时有效,有时无效(我猜这是线程逻辑设计不当的主要症状)。大多数情况下,我都会收到 EInterbaseError 消息“从连接读取数据时出错”。其他时候它只是锁定。
我应该与数据库建立单独的连接吗?
【问题讨论】:
-
绝对不应该在后台和前台线程之间共享到数据库的连接。
-
我同意沃伦的观点。对于数据库,除非您知道给定的数据库引擎(及其 VCL 组件)是线程安全的,否则不要跨线程边界共享数据库组件。为每个线程提供自己的连接和自己的一组本地数据库组件。否则,将您的数据库逻辑移动到专用线程,其他线程可以在需要时向其发布请求。
-
谢谢沃伦和雷米。我确实创建了一个单独的连接,现在一切正常。但我会保留我的问题,看看是否还有其他我应该担心的问题。
标签: multithreading delphi thread-safety delphi-7