Работа с TADOQuery в потоке - PullRequest
1 голос
/ 14 февраля 2011

Я пишу приложение, которое подключается к БД и периодически (с интервалом в 1 минуту) считывает данные из базы данных.Это что-то вроде чтения RSS-каналов, но с локальной базой данных.Если не удается прочитать данные, я пытаюсь восстановить соединение.Я разработал его с TADOConnection и TADOQuery, помещенными в форму (то есть без динамического создания) .Моя цель - сохранить приложение «живым» с точки зрения пользователя, поэтому я поместил соединение и часть для чтения в один поток.Вопрос в том, как это сделать наилучшим образом?

Мой дизайн выглядит следующим образом:

  • запуск приложения, TADOConnection и TADOQuery создаются вместе с формой
  • открыть соединение в отдельном потоке (TADOConnection)
  • если соединение установлено, приостановить поток подключения, запустить таймер в форме, который периодически возобновляет другой поток для чтения данных
  • , есличтение потока завершается успешно, ничего не происходит, а таймер формы продолжает работать, в случае сбоя поток останавливает таймер и возобновляет поток подключения

Лучше ли динамически создавать TADOConnection или TADOQuery или нетне имеет значения?Лучше ли использовать, например, критическую секцию в темах или что-то еще (у меня есть только один доступ к компоненту одновременно и только один поток)?

Спасибо за ваши предложения

Ответы [ 2 ]

8 голосов
/ 14 февраля 2011

Этот вопрос довольно субъективен, вероятно, недостаточно субъективен, чтобы быть закрытым, но субъективен в любом случае. Вот почему я бы использовал динамически созданные объекты ADO:

  • Сохраняет все вместе: код и объекты, используемые для доступа к коду. Использование объектов доступа к данным, созданных в форме, требует, чтобы Thread имел глубокие знания о внутренней работе формы, что никогда не было хорошей идеей.
  • Это безопаснее, потому что вы не можете получить доступ к этим объектам из других потоков (включая основной поток VCL). Конечно, вы не планируете использовать эти соединения для чего-то еще, вы не планируете использовать несколько потоков и т. Д., Но, возможно, однажды вы забудете об этих ограничениях.
  • Это будущее. Возможно, вы захотите использовать этот же поток из другого проекта. Возможно, вы захотите добавить второй поток, обращающийся к некоторым другим данным, к тому же приложению.
  • У меня есть личные предпочтения для динамического создания объектов доступа к данным из кода. Да, субъективный ответ на субъективный вопрос.
1 голос
/ 20 февраля 2011

Запустить все в теме.Имейте периодический таймер в потоке, который открывает соединение с БД, считывает данные, «отправляет» их обратно в основной поток, а затем отключается.Поток должен "спать" в ожидании времени, например, в Windows, даже если это сигнализируется таймером.Компоненты БД, которые являются локальными и частными для потока, могут быть созданы внутри потока при запуске выполнения потока (при запуске приложения) и освобождены по завершении выполнения потока (при завершении работы приложения).Это всегда будет работать, независимо от того, временно ли доступ к БД доступен или нет, и основной поток даже не должен связываться с «потоком БД».Это архитектура, которой я пользуюсь все время, и она абсолютно пуленепробиваема.

...