![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Ado и многопоточность [D7, Access]
Vilux © (2004-03-21 15:27:00)Какие "подводные камни" меня ждут при работе с БД (открытие, изменение, закрытие) мнопоточно? А то наблюдаются некоторые глюки. Я использую компоненты ADO. И еще вопрос, создаю SQL запрос INSERT, выполняю его в TAdoQuery, потом делаю SELECT, но эта новая запись не видится. Как мне обновить базу? Пробовал Ado.Close и потом Ado.Open, работает... но если сделать многопоточность, то и этот вариант не работает.
YurikGl (2004-03-21 23:27:00) [1]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 не глюкавая.
З.Ы. С этим работал мой брат, могу узнать подробности.
sniknik (2004-03-21 22:47:00) [2]YurikGl © (21.03.04 15:34) [2]
> Если долго много и одновременно обращаться к базе Access через ADO, то база рушится. Это - подтвержденный факт. Критическим является
> многопользовательность
кем подтвержденный?
могу дать опровержение. за все время работы с базами access ни одной порушеной. хотя время работы немаленькое.
могу предположить что причиной скорее является некомпетентность программиста а не многопользовательность.
> Vilux © (21.03.04 16:40) [5]
> Глюки есть... Если же все это делать не многопоточно, то все нормально.
это не глюки. тебе как раз и говорят что необходим вызов CoInitialize, в основном потоке вызаватся автоматом(в одном из модулей прописан) и естественно нормально.
YurikGl (2004-03-21 19:15:00) [3]re [6]
ADODataSet.Insert;
ADODataSet.fields[0].value:=....
...
ADODataSet.fields[k].value:=....
ADODataSet.post;
Vilux (2004-03-21 17:57:00) [4]Форум недавно не принимал сообщения... а потом все сразу отослались... ес-но я не специально.
Desdechado (2004-03-21 17:40:00) [5]я имел ввиду сообщения в форум десятками одинаковые сыпать ...
Vilux (2004-03-21 17:23:00) [6]Это тест...проверка... по идее, я создаю запись, а затем ее меняю. Так вот косяк в том, что не все записи потом меняются, если запускается поток...
P.S. Ны вышеприведенные вопросы, плиз, ответьте...очень надо... не знаю, уже как быть.
Desdechado (2004-03-21 16:58:00) [7]зачем постить 10 раз одно и то же?
Vilux (2004-03-21 16:57:00) [8]И еще
"Это - так сам наблюдал. Поэтому нечасто пользуюсь SQL-коммандой insert. Чаще говорю insert на dataset"
Можно примерчик? Как осуществить insert на dataset?
Vilux (2004-03-21 16:40:00) [9]Для теста, я создал цикл, например до 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;
KSergey (2004-03-21 15:37:00) [10]Многопользовательность тут совершенно ни при чем.
Доступ многих клиентов каждого через свой коннект - это одно. Доступ в нескольких параллельных потоках через 1 коннект без синхронизации - совершенно другое.
YurikGl (2004-03-21 15:36:00) [11]> И еще вопрос, создаю SQL запрос INSERT, выполняю его в TAdoQuery,
> потом делаю SELECT, но эта новая запись не видится
Это - так сам наблюдал. Поэтому нечасто пользуюсь SQL-коммандой insert. Чаще говорю insert на dataset
YurikGl (2004-03-21 15:34:00) [12]Если долго много и одновременно обращаться к базе Access через ADO, то база рушится. Это - подтвержденный факт. Критическим является многопользовательность
KSergey (2004-03-21 15:33:00) [13]TAdoQuery основного и дополнительного потока работают через 1 ADOConnection? Если да - то глюки будут. Если через разные - тогда пофигу, как я понимаю.
Проще использовать встроенный в ADO механизм асинхронного выполнения. Там все уже продумано за нас.
См. недавно была ветка про ту же тему.
> И еще вопрос, создаю SQL запрос INSERT, выполняю его в TAdoQuery,
> потом делаю SELECT, но эта новая запись не видится
Слабо в это верится, думаю все несколько не так, как описывается.
> Ado.Close и потом Ado.Open
Т.е. я не понял: а как же тогда "делаю SELECT"? Как его сделать иначе, чем Close/Open?