Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.04.18;
Скачать: CL | DM;

Вниз

Ado и многопоточность   Найти похожие ветки 

 
Vilux ©   (2004-03-21 15:27) [0]

Какие "подводные камни" меня ждут при работе с БД (открытие, изменение, закрытие) мнопоточно? А то наблюдаются некоторые глюки. Я использую компоненты ADO. И еще вопрос, создаю SQL запрос INSERT, выполняю его в TAdoQuery, потом делаю SELECT, но эта новая запись не видится. Как мне обновить базу? Пробовал Ado.Close и потом Ado.Open, работает... но если сделать многопоточность, то и этот вариант не работает.


 
KSergey ©   (2004-03-21 15:33) [1]

TAdoQuery основного и дополнительного потока работают через 1 ADOConnection? Если да - то глюки будут. Если через разные - тогда пофигу, как я понимаю.
Проще использовать встроенный в ADO механизм асинхронного выполнения. Там все уже продумано за нас.
См. недавно была ветка про ту же тему.

> И еще вопрос, создаю SQL запрос INSERT, выполняю его в TAdoQuery,
> потом делаю SELECT, но эта новая запись не видится

Слабо в это верится, думаю все несколько не так, как описывается.

> Ado.Close и потом Ado.Open

Т.е. я не понял: а как же тогда "делаю SELECT"? Как его сделать иначе, чем Close/Open?


 
YurikGl ©   (2004-03-21 15:34) [2]

Если долго много и одновременно обращаться к базе Access через ADO, то база рушится. Это - подтвержденный факт. Критическим является многопользовательность


 
YurikGl ©   (2004-03-21 15:36) [3]

> И еще вопрос, создаю SQL запрос INSERT, выполняю его в TAdoQuery,
> потом делаю SELECT, но эта новая запись не видится

Это - так сам наблюдал. Поэтому нечасто пользуюсь SQL-коммандой insert. Чаще говорю insert на dataset


 
KSergey ©   (2004-03-21 15:37) [4]

Многопользовательность тут совершенно ни при чем.
Доступ многих клиентов каждого через свой коннект - это одно. Доступ в нескольких параллельных потоках через 1 коннект без синхронизации - совершенно другое.


 
Vilux ©   (2004-03-21 16:40) [5]

Для теста, я создал цикл, например до 100, где в основном потоке вызывал процедуру, которая создавала "на ходу" TAdoConnection и TAdoQuery, заносила в БД запись,а потом уничтожала их. И только потом запускался отдельный поток, в котором происходил UPDATE записи, которую я занес. В нем также создавались отедельные TAdoConnection и TAdoQuery. Глюки есть... Если же все это делать не многопоточно, то все нормально.
Еще одна проблема, делаю так

with TMyThread.Create(True) do
try
  FreeOnTerminate := True;
  Resume;
except
  Free;
raise
end;

--------------------------------
TMyThread = class(TThread)
protected
 ..........
public
  ado:TADOConnection;
  query:TADOQuery;
end;

procedure TMyThread.Execute;
var
 url:string;
 status:boolean;
begin
 url:="";
 status:=false;
 ado:=TADOConnection.Create(nil);<--Здесь пишет
 "Не был произведен вызов CoInitialize"
 Что я делаю не так?
 ...
end;


 
Vilux ©   (2004-03-21 16:57) [6]

И еще
"Это - так сам наблюдал. Поэтому нечасто пользуюсь SQL-коммандой insert. Чаще говорю insert на dataset"
Можно примерчик? Как осуществить insert на dataset?


 
Desdechado ©   (2004-03-21 16:58) [7]

зачем постить 10 раз одно и то же?


 
Vilux ©   (2004-03-21 17:23) [8]

Это тест...проверка... по идее, я создаю запись, а затем ее меняю. Так вот косяк в том, что не все записи потом меняются, если запускается поток...
P.S. Ны вышеприведенные вопросы, плиз, ответьте...очень надо... не знаю, уже как быть.


 
Desdechado ©   (2004-03-21 17:40) [9]

я имел ввиду сообщения в форум десятками одинаковые сыпать ...


 
Vilux ©   (2004-03-21 17:57) [10]

Форум недавно не принимал сообщения... а потом все сразу отослались... ес-но я не специально.


 
YurikGl ©   (2004-03-21 19:15) [11]

re [6]
ADODataSet.Insert;
ADODataSet.fields[0].value:=....
...
ADODataSet.fields[k].value:=....
ADODataSet.post;


 
sniknik ©   (2004-03-21 22:47) [12]

YurikGl ©   (21.03.04 15:34) [2]
> Если долго много и одновременно обращаться к базе Access через ADO, то база рушится. Это - подтвержденный факт. Критическим является
> многопользовательность

кем подтвержденный?
могу дать опровержение. за все время работы с базами access ни одной порушеной. хотя время работы немаленькое.

могу предположить что причиной скорее является некомпетентность программиста а не многопользовательность.

> Vilux ©   (21.03.04 16:40) [5]
> Глюки есть... Если же все это делать не многопоточно, то все нормально.
это не глюки. тебе как раз и говорят что необходим вызов CoInitialize, в основном потоке вызаватся автоматом(в одном из модулей прописан) и естественно нормально.


 
YurikGl ©   (2004-03-21 23:27) [13]

re [12]

>> кем подтвержденный?

Приведу два упоминания помимо моего

http://www.databases.ru/viewtopic.php?p=373&sid=d1221f5e3d8487bfad75d84d7a0eedcb

http://www.linux.org.ru/view-message.jsp?msgid=186100

"база ACCESS фактически, когда льют в нее более 10 чел одновременно, рушиться и восстановлению не подлежит, прямо караул какой-то !!! "

>>могу дать опровержение. за все время работы с базами access ни одной порушеной. хотя время работы немаленькое.

Наверно конкретная версия access не глюкавая.

З.Ы. С этим работал мой брат, могу узнать подробности.



Страницы: 1 вся ветка

Текущий архив: 2004.04.18;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.037 c
8-1072123867
Bagzoid
2003-12-22 23:11
2004.04.18
Игровое поле TImage. Хочу поместить на нам фишку TImage.


14-1080213221
Виктор
2004-03-25 14:13
2004.04.18
Как SQL - запросом в Firebird-е получить


14-1080541211
Layner
2004-03-29 10:20
2004.04.18
Кто смотрит "Момент истины" в 20.00 по ТВЦ???


1-1080336872
IGray
2004-03-27 00:34
2004.04.18
Хитрые исключения в конструкторе


1-1080590699
Shopot
2004-03-30 00:04
2004.04.18
Горячие клавиши в Delphi.