在线程中使用TADOQuery

1 delphi multithreading tadoquery

我正在编写应用程序,它连接到数据库并重复(1分钟间隔)从数据库中读取数据.它类似于RSS提要阅读器,但使用本地数据库.如果数据读取失败,我会尝试重新建立连接.我设计了TADOConnection和TADOQuery放在窗体上(所以没有动态创建).我的目标是从用户的角度保持应用程序"活着",因此我将连接和读取部分放在一个线程中.问题是,如何做到最好的方式?

我的设计看起来像这样:

  • 应用程序启动时,TADOConnection和TADOQuery与表单一起创建
  • 在单独的线程中打开连接(TADOConnection)
  • 如果连接已建立,则挂起连接线程,在表单上启动计时器,该计时器会定期恢复另一个线程以进行数据读取
  • 如果读取线程成功,则没有任何反应,表单计时器继续运行,如果失败,则线程停止计时器并恢复连接线程

是否更好地动态创建TADOConnection或TADOQuery或无关紧要?在线程或其他东西中使用例如关键部分是否更好(我只能同时访问一个组件而只有一个线程)?

谢谢你的建议

Cos*_*und 8

这个问题是相当主观的,可能不是主观的,无论如何都是封闭的,但主观的.这就是为什么我会选择动态创建的ADO对象:

  • 将所有内容保持在一起:用于访问代码的代码和对象.使用在表单上创建的数据访问对象需要Thread了解Form的内部工作,这绝不是一个好主意.
  • 它更安全,因为您无法从其他线程(包括主VCL线程)访问这些对象.当然,你没有计划将这些连接用于其他任何事情,你不打算使用多个线程等,但也许你有一天会忘记这些限制.
  • 这是面向未来的.您可能希望使用来自其他项目的相同线程.您可能希望将第二个线程添加到同一个应用程序中访问其他一些数据.
  • 我个人倾向于从代码中动态创建数据访问对象.是的,主观问题的主观答案.

  • @daemon_x,如果你的数据库支持事务,你将以任何方式使用事务:明确地,如果你从代码启动和停止事务,或者隐式地调用`TADOQuery.Open()`.问题是,隐式打开的事务需要在某个时间停止,如果您使用它们,您将需要了解ADO驱动程序如何处理它们,默认事务隔离级别是什么.手动启动和停止交易要简单得多! (2认同)