Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > БД в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 27.07.2010, 06:35   #1
xStill
Пользователь
 
Регистрация: 04.05.2009
Сообщений: 17
Вопрос Обращение к БД из потока

Добрый день! С базами данных работал не много, поэтому уперся в одну ситуацию:

Есть сервер (на TServerSocket), при подключении нового клиента - выделяется отдельный поток (одновременно работают около тысячи потоков).
Раньше все клиенты обращались к одной базе данных (открытой на главной форме сервера) каждый из своего потока - это работает прекрасно, но на данный момент возникла необходимость вести отделюную БД для каждого из клиентов (БД на парадоксе, работаю с ней через TTable).

Проблема состоит в том, что загромождать форму тысячей тэйблов - как минимум не логично, а обращение из разных потоков (каждый к своей БД) через один компонент будет создавать перекрестные запросы.

Вопрос: как организовать работу с большим количеством баз данных (по одной на каждого подключенного клиента)?

Буду благодарен за любую информацию. Заранее спасибо.
xStill вне форума Ответить с цитированием
Старый 27.07.2010, 08:56   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

А ты в каждом потоке создавай свой компонент для работы с БД.
Я лично так и делаю.
Например
Код:
unit Unit1;

interface

uses activex,
  Classes,adodb;

type
  wqeqwe = class(TThread)
  private    ado:TADOQuery;
    { Private declarations }
  protected
    procedure Execute; override;
  end;

implementation

{ wqeqwe }

procedure wqeqwe.Execute;
begin
 CoInitialize(0);
 ado:=TADOQuery.Create(self);
 ado.ConnectionString:=...
  { Place thread code here }
 CoUninitialize;
end;

end.
Ну и используй его. При освобождении потока компонент тоже освободит память.
I'm learning to live...

Последний раз редактировалось Stilet; 27.07.2010 в 11:15.
Stilet вне форума Ответить с цитированием
Старый 27.07.2010, 09:33   #3
xStill
Пользователь
 
Регистрация: 04.05.2009
Сообщений: 17
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
А ты в каждом потоке создавай свой компонент для работы с БД.
Я лично так и делаю.
Ну и используй его. При освобождении потока компонент тоже освободит память.
Спасибо, я об этом почему-то и не подумал
Но тут возникает другой вопрос: как быть со скоростью выполнения?
Create ведь займет довольно много времени. (возможно я не прав, если что поправьте) Проблема в том, что пока сервер будет создавать компонент и работать с ним, клиент будет ожидать ответа, что замедлит работу - поэтому время очень важно.
Вот если бы это:
Код:
 ado:=TADOQuery.Create(self);
выполнялось еще до старта потока... только не могу придумать как это организовать. Ночь не спал, голова плохо работает

Последний раз редактировалось xStill; 27.07.2010 в 09:38.
xStill вне форума Ответить с цитированием
Старый 27.07.2010, 11:10   #4
soleil@mmc
SQL-коддинг
Участник клуба
 
Регистрация: 16.01.2009
Сообщений: 1,192
По умолчанию

придумай веселую заставочку с викториной и ценными призами
тогда никто тормозов не заметит
soleil@mmc вне форума Ответить с цитированием
Старый 27.07.2010, 11:15   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Create ведь займет довольно много времени.
Чего это? Ниразу. Тормозить будет при получении набора по запросу, если СУБД настроена неоптимально, если набор огромен и прочие если, но никак не при создании объекта.

Да, поскольку это в потоке, я свой пример поправлю чуть, выделив моменты, без которых может заругаться.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 27.07.2010, 12:55   #6
xStill
Пользователь
 
Регистрация: 04.05.2009
Сообщений: 17
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Чего это? Ниразу. Тормозить будет при получении набора по запросу, если СУБД настроена неоптимально, если набор огромен и прочие если, но никак не при создании объекта.
Я немного кажется ошибся Тут дело не совсем в конструкторе, а в работе компонента в целом. Дело в том, что я имел подобный опыт с другими компонентами. Может быть с компонентами БД совсем другое, но вот к примеру StringList сильно затормаживает подобные процессы даже при незначительном количестве данных.
Однако, попробую создать в потоке, может что и выйдет. Спасибо!

Цитата:
Сообщение от soleil@mmc Посмотреть сообщение
придумай веселую заставочку с викториной и ценными призами
тогда никто тормозов не заметит
Задумка конечно хорошая, однако в данном случае это не применимо. Это будет все равно что 3 секунды рекламы перед отправкой и получением каждого сообщения в ISQ.

Последний раз редактировалось xStill; 27.07.2010 в 12:58.
xStill вне форума Ответить с цитированием
Старый 27.07.2010, 12:57   #7
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
но вот к примеру StringList сильно затормаживает подобные процессы даже при незначительном количестве данных.
Ниразу не нарывался на тормоза при его создании. И ниразу не нарывался на тормоза при загрузке файла, даже были файлы по миллиону строк.
Ты что-то путаешь, либо программы пускаешь на слабеньких машинах.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 27.07.2010, 13:00   #8
xStill
Пользователь
 
Регистрация: 04.05.2009
Сообщений: 17
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Ниразу не нарывался на тормоза при его создании. И ниразу не нарывался на тормоза при загрузке файла, даже были файлы по миллиону строк.
Ты что-то путаешь, либо программы пускаешь на слабеньких машинах.
Странно, может быть у меня что-то не то с системой (хотя машина более чем сильная). Сейчас начну старые проекты просматривать, может ошибку найду
xStill вне форума Ответить с цитированием
Старый 27.07.2010, 18:28   #9
soleil@mmc
SQL-коддинг
Участник клуба
 
Регистрация: 16.01.2009
Сообщений: 1,192
По умолчанию

в каждой шутке есть доля шутки
прежде чем критиковать предложенное (см. пост Stilet-а) стоит его опробовать

а тестировать лучше всего на самой слабой тачке
тогда вылезут косяки, которые на быстрой тачке вряд ли появятся при тестировании (собсна из-за несовершенства самого тестирования)
soleil@mmc вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Номер потока KoBRaAndrey Общие вопросы Delphi 1 01.06.2010 02:27
Создание потока GoldP Win Api 0 14.05.2010 21:28
Перезапуск потока RNT Общие вопросы C/C++ 3 14.08.2009 14:54
Распараллеливание потока eXa Общие вопросы Delphi 3 19.07.2007 20:11