Работа с TADOQuery в потоке
Я пишу приложение, которое подключается к БД и периодически (с интервалом в 1 минуту) считывает данные из базы данных. Это что-то вроде чтения RSS-каналов, но с локальной базой данных. Если чтение данных не удается, я пытаюсь восстановить соединение. Я разработал его с помощью TADOConnection и TADOQuery, помещенных в форму (без динамического создания). Моя цель - сохранить приложение "живым" с точки зрения пользователя, поэтому я поместил соединение и часть для чтения в один поток. Вопрос в том, как это сделать лучше всего?
Мой дизайн выглядит так:
- запуск приложения, TADOConnection и TADOQuery создаются вместе с формой
- открыть соединение в отдельном потоке (TADOConnection)
- если соединение установлено, приостановите поток подключения, запустите таймер в форме, которая периодически возобновляет другой поток для чтения данных.
- если поток чтения завершается успешно, ничего не происходит, а таймер формы продолжает работать, если он не работает, поток останавливает таймер и возобновляет поток подключения.
Лучше динамически создавать TADOConnection или TADOQuery или это не имеет значения? Лучше использовать, например, критическую секцию в потоках или что-то (у меня есть только один доступ к компоненту одновременно и только один поток)?
Спасибо за ваши предложения
2 ответа
Этот вопрос довольно субъективен, вероятно, недостаточно субъективен, чтобы его можно было закрыть, но в любом случае субъективен. Вот почему я бы выбрал динамически созданные объекты ADO:
- Хранит все вместе: код и объекты, используемые для доступа к коду. Использование объектов доступа к данным, созданных в форме, требует, чтобы Thread имел глубокие знания о внутренней работе формы, что никогда не было хорошей идеей.
- Это безопаснее, потому что вы не можете получить доступ к этим объектам из других потоков (включая основной поток VCL). Конечно, вы не планируете использовать эти соединения для чего-то еще, вы не планируете использовать несколько потоков и т. Д., Но, возможно, однажды вы забудете об этих ограничениях.
- Это будущее. Возможно, вы захотите использовать этот же поток из другого проекта. Возможно, вы захотите добавить второй поток, обращающийся к некоторым другим данным в том же приложении.
- У меня есть личные предпочтения для создания объектов доступа к данным динамически из кода. Да, субъективный ответ на субъективный вопрос.
Запустите все в потоке. Имейте периодический таймер в потоке, который открывает соединение с БД, считывает данные, "отправляет" их обратно в основной поток, а затем отключается. Поток должен "спать" в ожидании времени, например, в Windows, даже если это сигнализируется таймером. Компоненты БД, которые являются локальными и частными для потока, могут быть созданы внутри потока при запуске выполнения потока (при запуске приложения) и освобождены по завершении выполнения потока (при завершении работы приложения). Это всегда будет работать, независимо от того, временно ли доступ к БД доступен или нет, и основной поток даже не должен связываться с "потоком БД". Это архитектура, которой я пользуюсь все время, и она абсолютно пуленепробиваема.