![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Проблема с Update blob-поля
iamkate © (2005-10-12 14:10:00)У меня большая проблема.
Есть таблица, с которой одновременно работают много пользователей. В ней есть blob-поле.
И если я пытаюсь сделать update в то время, когда другие пользователи что-то вставляют в таблицу или тоже
делают update, он зависает на строке Execute. Если же никто не делает insert или update, то все проходит нормально, хоть и долго.
До того, как в таблицу добавили blob-поле все шло хорошо и быстро.
Помогите, пожалуйста, решить проблему. (Blob-поле содержит bmp-картинки).
Спасибо.
Привожу пример своей процедуры:
Procedure
Var
lobTmp : TLOBLocator;
buff : ansistring;
fs:TMemoryStream;
begin
with OracleQuery do
begin
Clear;
DeleteVariables;
DeclareVariable('NAME', otString);
DeclareVariable('FAM', otString);
SQL.Clear;
SQL.Add('BEGIN UPDATE_PERSON (:NAME, :FAM); END; ');
SetVariable('NAME', edit1.Text);
SetVariable('FAM', edit2.Text);
Execute;
end;
with MyOracleQuery do
begin
fs:= TMemoryStream.Create;
image.Picture.Bitmap.SaveToStream(fs);
fs.Seek(0, soFromBeginning);
SetLength(buff, fs.Size);
fs.Read(buff[1], fs.Size);
fs.Free;
lobTmp := TLOBLocator.Create(qryBlob.Session, otblob);
SetVariable('ZAL_SUB', FKeyFieldValue);
try
SetComplexVariable('Photo', lobTmp);
try
Execute;
lobTmp.AsString := Buff;
except
on E:Exception do
MessageDlg(E.Message, mtError, [mbYes], 0);
end;
finally
lobTmp.Free;
end;
OracleSession.Commit;
end;
end.
iamkate (2005-10-13 14:52:00) [1]>Выкинь фото из запроса. Доставай его отдельным запросом по требованию >юзера как я написал в [1].
Большое спасибо. Это помогло. Теперь ничего не виснет и скорость увеличилась до 20 сек (раньше update шел не меньше 1,5 мин.)
Извиняюсь, что поздно сообщаю.
ANB (2005-10-13 14:14:00) [2]
> Sergey13 © (13.10.05 13:23) [58]
Не работает он в жесткой конторе. Огреб бы пару раз штрафов по 30 баксов, быстро бы грамотно писать научился.
Sergey13 (2005-10-13 13:23:00) [3]2[56] ANB © (13.10.05 12:37)
Да брось ты. Он видимо непрошибаемый. Пусть коммитит. Жалко что ли. 8-)
Seg (2005-10-13 13:21:00) [4]Года через 2 приходит новый программер
Документировать систему не пытались?
ANB (2005-10-13 12:37:00) [5]
> Seg (13.10.05 11:14) [51]
- удалось. Только она на клиппере еще писана была. На оракл надо переписывать.
> Seg (13.10.05 11:54) [55]
- сначала на этапе проектирования решается, что можно так делать. Года через 2 приходит новый программер и удивляется, почему, если он выполняет в одной транзакции 2 процедуры, то они выполняются в разных. Причем он может и не удивиться, так как заметит скорее всего только пользователь, когда у него данные в базе поедут.
Seg (2005-10-13 11:54:00) [6]невозможно в ряде случаев.
А вот эти случаи надо максимально избегать на этапе проектирования.
Если этого избежать невозможно, то можно и не писать коммиты в процедурах. Но мне такие процадуры разрабатывать не приходилось.
Sergey13 (2005-10-13 11:43:00) [7]2[53] Seg (13.10.05 11:37)
И это требование к системе должно обеспечиваться каждый раз в любой задаче. А если писать коммиты в каждой процедуре, то обеспечить это требование с использованием этих процедур невозможно в ряде случаев.
Seg (2005-10-13 11:37:00) [8]Это не задача, а общее требование к системе, причем к любой системе.
Sergey13 (2005-10-13 11:21:00) [9]2[50] Seg (13.10.05 11:13)
>А может перестанете кривляться
Какой ты грубый.
>и опишете всю задачу сразу?
Обеспечить целостность данных при множественном вызове модифицирующих процедур.
Seg (2005-10-13 11:14:00) [10]бухгалтерию, успешно конкурирующую с 1С
Ну в Вам, то это удалось?
Seg (2005-10-13 11:13:00) [11]Ну а если такую процедуру надо больше 1 раза запустить? И при этом или все или ничего?
А может перестанете кривляться и опишете всю задачу сразу?
Sergey13 (2005-10-13 11:01:00) [12]2[47] Seg (13.10.05 10:56)
Вилять продолжаем. 8-)
Ну а если такую процедуру надо больше 1 раза запустить? И при этом или все или ничего?
ANB (2005-10-13 10:58:00) [13]
> Seg (13.10.05 10:53) [46]
- прежде чем что то советовать, нужно что написать самому. Например бухгалтерию, успешно конкурирующую с 1С. А пока слушать советы не раз наступавших на грабли.
Не от хорошей жизни не рекомендуется :
- использовать коммит и обычный роллбэк в процедурах
- использовать DML в функциях
Seg (2005-10-13 10:56:00) [14]1,2,3 - это такие отдельные процедуры с коммитами
Это одна процедура.
Кстати, при желании пункты 1 и 2 можно выполнить одним запросом и если глюк, то сделать RollBack, если нет, то выполнить остальные пункты.
Seg (2005-10-13 10:53:00) [15]Да и код длиннее и менее логичен
Я бы посоветовал сначала определить максимально оптимальное решение задачи, а уж потом написать простой и безотказный код.
Но многие предпоситают не думать, а писать килотонны кода, в котором сами потом не смогут разобраться.
Sergey13 (2005-10-13 10:53:00) [16]2[44] Seg (13.10.05 10:48)
Вопрос был про коммиты в процедурах. Если в [41] Seg (12.10.05 17:53) 1,2,3 - это такие отдельные процедуры с коммитами, что будет если глюк?
Seg (2005-10-13 10:48:00) [17]не увиливайте, ответьте пожалуйста
Это не увиливание от ответа, это выпрямление кривых процедур.
ANB (2005-10-12 17:57:00) [18]
> Seg (12.10.05 17:53) [41]
Хе, коммит то все равно в конце. А есть случаи и более сложные. Например : по количественной проводке по таблице настроек генерим кучу суммовых. На последней выяснем, что из-за, например, недостатка денег на счету, не можем выполнить операцию. Конечно, можно гулять 2 раза - сначала проверки, потом запросы. Но это не снимает проблему ошибки сервера. Да и код длиннее и менее логичен.
Val (2005-10-12 17:55:00) [19]не увиливайте, ответьте пожалуйста
Seg (2005-10-12 17:53:00) [20]Почему не сделать в правильной последовательности?
1.Запомнить остаток
2.Перенести остаток на счет 3
3.Удалить счет 1
4.COMMIT