【问题标题】:Working with TADOQuery in thread在线程中使用 TADOQuery
【发布时间】:2011-02-14 15:12:17
【问题描述】:

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

我的设计是这样的:

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

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

感谢您的建议

【问题讨论】:

标签: multithreading delphi tadoquery


【解决方案1】:

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

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

【讨论】:

  • +1 作为答案,您将如何创建它们?定期创建并释放它们,还是先创建连接,定期创建并释放查询,最后释放连接?
  • @daemon_x,它取决于你使用的数据库。我通常会创建连接和查询一次,并在线程的整个生命周期中保留它们(或者直到我遇到一些 ADO 异常),但是如果您的 SQL 服务器是按连接获得许可的,那么这可能不是一个好主意。在内部循环(每分钟执行一次的循环)中,我将启动和停止事务。当然,并非所有可通过 ADO 访问的数据库都有事务。
  • @Cosmin Prund - 听起来不错,是的,我使用的是 MSSQL,所以我可以使用事务,但是对于启动和停止事务,您的意思是 TADOConnection.BeginTrans, CommitTrans 吗?它比 TADOQuery.Open, Close 更快还是更好?我真的只想从数据库中读取数据,而且我知道事务只是为了编写观点(并且仅在 SQL 脚本中,而不是在 ADO 组件中:)。
  • @daemon_x,如果您的数据库支持事务,那么您将以任何方式使用事务:如果您从代码中启动和停止事务,则显式地使用事务,或者如果您调用 TADOQuery.Open(),则隐式地使用事务。问题是,隐式打开的事务需要在某个时候停止,如果你使用它们,你需要了解你的 ADO 驱动程序如何处理它们,默认的事务隔离级别是什么。手动启动和停止事务要简单得多!
  • @daemon_x, Isolation @ Wikipedia 谈到了事务是什么以及它们是如何工作的。一句话,您对数据库所做的所有工作都发生在一个事务的上下文中。您可以一次执行多个操作,然后为所有操作调用 Commit 或 Rollback。当您调用TADOQuery.Open() 时,您可以从数据库中获取数据,如果您愿意,您可以.Close() 该查询,或者您可以.Open() 另一个查询。所有这些操作都需要在调用BeginTrans 和CommitTrans(或Rollback)之间进行
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2015-09-03
    • 1970-01-01
    • 2013-04-18
    • 2011-03-18
    • 2013-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多