![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Query для каждого потока... [D6, ]
Олег Лаукарт © (2001-12-25 11:07:00)В проекте запускается незапланированное но ограниченное лимитом число потоков. Каждый поток периодически делает select из базы для выборки по ключу одной записи и дальше, до следующего раза, ему с базой работать не надо. Периодичность обращений скачкообразная. Все потоки работают с одной базой. Потоков может быть достаточно много!...
Как организовать функционирование такой системы с наименьшими затратами ресурсов (в первую очередь память и время на подключение к базе) и чтобы не было коллизий с многопотоковостью?
По идее напрашивается некий пул. Буду благодарен за рекомендации и ссылки.
panov (2001-12-25 16:16:00) [1]Интересно было бы услышать подробнее о требованиях к задаче.
Может быть, еще бы какие мысли возникли.
У меня эта задача была написана как раз из требований кратковременности запросов(обработка запросов из CGI).
Поэтому интересно было бы подумать над другими применениями.
Олег Лаукарт (2001-12-25 15:57:00) [2]Хороший вопрос! должно работать независимо от базы. Запросы очень простые - выбрать запись и потом работать с полученной информацией. Удалять эти записи надо редко, но иногда надо. Если в процессе работы запись ктото удалит - не страшно - это входит в логику работы. Главный критерий скорость и память.
panov (2001-12-25 15:46:00) [3]>Олег Лаукарт (25.12.01 15:31)
"Мои потоки требуют базу много раз и время их жизни велико, поэтому в промежутках они могут базу делить с другими."
- Не бывает одинаковых задач. :-)
"Почему ты используешь именно GlobalAddAtom для блокирования? "
- Да сам не знаю...:-)
Для какой СУБД писать собираешься?
Олег Лаукарт (2001-12-25 15:31:00) [4]Я посмотрел исходники. Идею понял, но у меня задача немного другая. Мои потоки требуют базу много раз и время их жизни велико, поэтому в промежутках они могут базу делить с другими.
Почему ты используешь именно GlobalAddAtom для блокирования? Почему не CriticalSection - традиции или есть основания?
В окне после Show я вместо BringToFront использую SetFocus.
panov (2001-12-25 15:04:00) [5]Пишите по почте - отвечу.
petr_v_a (2001-12-25 14:41:00) [6]>panov я тоже хочу такие исходники :)
panov (2001-12-25 14:28:00) [7]Лови исходники программы - на Delphi5.
Для чего написана - расскажу, если потребуется.
Кое-где коряво написано, м.б. и сам что посоветуешь мне.
Олег Лаукарт (2001-12-25 13:29:00) [8]Как ты определяешь какой DataBase свободен? Через мьютекс?
Сортируешь ты какимто образом список баз? В некоторых случаях может быть полезным выдавать одному и томуже потоку один тотже Query с которым он работал в прошлый раз если таковой свободен (на всякий случай, может поможет :). можешь ли кинуть по почте какието исходники кроме указанной библиотеки ее я уже качаю?
panov (2001-12-25 13:03:00) [9]Увы - тут я пас, Delphi6 у меня нет...
Олег Лаукарт (2001-12-25 12:10:00) [10]Хорошоб с БДЕ ситуация вроде ясна. Что делать если исполуешь dbExpress-овские TSQLConnection и TSQLClientDataSet. У них нет понятия сессии. Есть клонирование. Заменяет ли оно сессии БДЕ?
panov (2001-12-25 11:57:00) [11]Sorry - "TSession"
panov (2001-12-25 11:56:00) [12]Да - для каждого экземпляра TDataBase указываешь сой TDataSession.
Олег Лаукарт (2001-12-25 11:28:00) [13]Нужно ли и как в этой ситуации использовать Session.
panov (2001-12-25 11:24:00) [14]Посмотри в кладовке:
http://delphi.mastak.ru/cgi-bin/download.pl?get=990158073&n=0
В свое время мне понравилась эта библиотека.
Но если ты для подключения к БД используешь BDE, то количество подключений у тебя будет ограничено.
У меня для таких же целей используется такая архитектура(хотя и без вышеуказанной библиотеки):
Подключения к БД происходят один раз из нескольких потоков.
Для выполнения SQL динамически создаются потоки, в которых выбирается компонент БД, свободный в данный момент(не выполняется запрос), или ожидается, пока одна TDataBase из списка освободится.
После выполнения запроса данные передаются клиенту, используемый экземпляр TDataBase освобождается.
Плюс такой архитектуры: минимизировано время подключения к БД.
Минусы: пока не знаю:-)