Форум: "Базы";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.01.31;
Скачать: [xml.tar.bz2];




Вниз

Query для каждого потока... 


Олег Лаукарт   (2001-12-25 11:07) [0]

В проекте запускается незапланированное но ограниченное лимитом число потоков. Каждый поток периодически делает select из базы для выборки по ключу одной записи и дальше, до следующего раза, ему с базой работать не надо. Периодичность обращений скачкообразная. Все потоки работают с одной базой. Потоков может быть достаточно много!...

Как организовать функционирование такой системы с наименьшими затратами ресурсов (в первую очередь память и время на подключение к базе) и чтобы не было коллизий с многопотоковостью?
По идее напрашивается некий пул. Буду благодарен за рекомендации и ссылки.



panov   (2001-12-25 11:24) [1]

Посмотри в кладовке:
http://delphi.mastak.ru/cgi-bin/download.pl?get=990158073&n=0
В свое время мне понравилась эта библиотека.
Но если ты для подключения к БД используешь BDE, то количество подключений у тебя будет ограничено.

У меня для таких же целей используется такая архитектура(хотя и без вышеуказанной библиотеки):

Подключения к БД происходят один раз из нескольких потоков.
Для выполнения SQL динамически создаются потоки, в которых выбирается компонент БД, свободный в данный момент(не выполняется запрос), или ожидается, пока одна TDataBase из списка освободится.

После выполнения запроса данные передаются клиенту, используемый экземпляр TDataBase освобождается.

Плюс такой архитектуры: минимизировано время подключения к БД.
Минусы: пока не знаю:-)



Олег Лаукарт   (2001-12-25 11:28) [2]

Нужно ли и как в этой ситуации использовать Session.



panov   (2001-12-25 11:56) [3]

Да - для каждого экземпляра TDataBase указываешь сой TDataSession.



panov   (2001-12-25 11:57) [4]

Sorry - "TSession"



Олег Лаукарт   (2001-12-25 12:10) [5]

Хорошоб с БДЕ ситуация вроде ясна. Что делать если исполуешь dbExpress-овские TSQLConnection и TSQLClientDataSet. У них нет понятия сессии. Есть клонирование. Заменяет ли оно сессии БДЕ?



panov   (2001-12-25 13:03) [6]

Увы - тут я пас, Delphi6 у меня нет...



Олег Лаукарт   (2001-12-25 13:29) [7]

Как ты определяешь какой DataBase свободен? Через мьютекс?
Сортируешь ты какимто образом список баз? В некоторых случаях может быть полезным выдавать одному и томуже потоку один тотже Query с которым он работал в прошлый раз если таковой свободен (на всякий случай, может поможет :). можешь ли кинуть по почте какието исходники кроме указанной библиотеки ее я уже качаю?



panov   (2001-12-25 14:28) [8]

Лови исходники программы - на Delphi5.
Для чего написана - расскажу, если потребуется.
Кое-где коряво написано, м.б. и сам что посоветуешь мне.



petr_v_a   (2001-12-25 14:41) [9]

>panov я тоже хочу такие исходники :)



panov   (2001-12-25 15:04) [10]

Пишите по почте - отвечу.



Олег Лаукарт   (2001-12-25 15:31) [11]

Я посмотрел исходники. Идею понял, но у меня задача немного другая. Мои потоки требуют базу много раз и время их жизни велико, поэтому в промежутках они могут базу делить с другими.

Почему ты используешь именно GlobalAddAtom для блокирования? Почему не CriticalSection - традиции или есть основания?

В окне после Show я вместо BringToFront использую SetFocus.



panov   (2001-12-25 15:46) [12]

>Олег Лаукарт (25.12.01 15:31)

"Мои потоки требуют базу много раз и время их жизни велико, поэтому в промежутках они могут базу делить с другими."
- Не бывает одинаковых задач. :-)

"Почему ты используешь именно GlobalAddAtom для блокирования? "
- Да сам не знаю...:-)

Для какой СУБД писать собираешься?



Олег Лаукарт   (2001-12-25 15:57) [13]

Хороший вопрос! должно работать независимо от базы. Запросы очень простые - выбрать запись и потом работать с полученной информацией. Удалять эти записи надо редко, но иногда надо. Если в процессе работы запись ктото удалит - не страшно - это входит в логику работы. Главный критерий скорость и память.



panov   (2001-12-25 16:16) [14]

Интересно было бы услышать подробнее о требованиях к задаче.
Может быть, еще бы какие мысли возникли.

У меня эта задача была написана как раз из требований кратковременности запросов(обработка запросов из CGI).
Поэтому интересно было бы подумать над другими применениями.




Форум: "Базы";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.01.31;
Скачать: [xml.tar.bz2];




Наверх





Память: 0.74 MB
Время: 0.026 c
3-99907           TonnyS                2001-12-29 13:31  2002.01.31  
Как с помощью SQL-запроса добавить/изменить MEMO или BLOB поле?


14-100058         Seery                 2001-12-05 11:12  2002.01.31  
Бездарность


4-100117          Cobalt                2001-11-25 19:44  2002.01.31  
Как работать с этим проклятым PChar?


4-100112          Tippy                 2001-11-29 20:44  2002.01.31  
Как в Трей добавить текст?


3-99852           Georg                 2001-12-20 17:08  2002.01.31  
Проблема выбора: MySQL или Interbase