1

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

我的设计如下所示:

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

动态创建 TADOConnection 或 TADOQuery 更好还是无关紧要?在线程中使用例如关键部分是否更好(我同时只有一个组件访问权限并且只有一个线程)?

感谢您的建议

4

2 回答 2

8

这个问题是相当主观的,可能不够主观以至于无法结束,但无论如何都是主观的。这就是我选择动态创建的 ADO 对象的原因:

  • 将所有内容放在一起:代码和用于访问代码的对象。使用在表单上创建的数据访问对象需要线程对表单的内部工作有深入的了解,这绝不是一个好主意。
  • 它更安全,因为您无法从其他线程(包括主 VCL 线程)访问这些对象。当然,您不打算将这些连接用于其他任何事情,也不打算使用多个线程等,但也许有一天您会忘记这些限制。
  • 这是面向未来的。您可能想要使用来自其他项目的相同线程。您可能想要添加第二个线程来访问同一个应用程序的一些其他数据。
  • 我个人偏好从代码动态创建数据访问对象。是的,对主观问题的主观回答。
于 2011-02-14T15:27:34.883 回答
1

运行线程中的所有内容。在打开数据库连接的线程中有一个定期计时器,读取数据,将其“发布”回主线程,然后断开连接。线程在等待时间时需要“休眠”,例如在 Windows 上,即使是由计时器发出信号。DB 组件是线程本地的和私有的,可以在线程执行开始时(在应用程序启动时)在线程内创建,并在线程执行完成时(在应用程序关闭时)释放。这将始终有效,无论数据库连接是否暂时可用,主线程甚至不必与“数据库线程”通信。这是我一直使用的架构,绝对是防弹的。

于 2011-02-20T09:36:23.410 回答