Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2002.08.05;
Скачать: [xml.tar.bz2];

Вниз

Убить DataSet   Найти похожие ветки 

 
flider   (2002-07-12 13:09) [0]

Приветствую всех!
Есть проблема, может кто поможет.
В ходе работы приложения при выполнении поиска формируется SQL-ный запрос,
результатом работы которого является некий подобранный DataSet. Если после
этого опять выполняется поиск, то предыдущий DataSet закрывается, но не
уничтожается. Из-за этого после 3-7 крупных поисков происходит
переполнение памяти и приложение вешается.
Вопрос: можно ли каким-либо образом ликвидировать старый DataSet при
выполнении нового поиска, но чтобы при этом не вешалось приложени с
системой вместе.
Спасибо.


 
Nikolay M.   (2002-07-12 14:03) [1]

Не совсем понял, что означает "закрывается, но не уничтожается", но что-то подсказывает, что можно попробовать этот злосчастный DataSet формировать руками динамически по Create/Free...


 
flider   (2002-07-12 14:17) [2]

"Закрывается, но не уничтожается" имеется в виду, что после команды QueryClose не высвобождается участок памяти, куда пишется результат выполнения запроса. Из-за этого, собственно, все проблемы.
А каким образом формировать DataSet руками? Там SQL-ный запрос, который формируется путем выбора пользователем параметров поиска.


 
Johnmen   (2002-07-12 14:24) [3]

просто Close для датасета


 
BAY   (2002-07-12 14:29) [4]

Он должон ударяться. Кинь код.


 
BAY   (2002-07-12 14:30) [5]

Ок. Я не видел с 3-го


 
Nikolay M.   (2002-07-12 15:15) [6]


> А каким образом формировать DataSet руками?


MyQuery := TQuery.Create;
try
MyQuery.SQL.Text := "SELECT * FROM AnyTable";
MyQuery.Active := True;
.... // Действия после открытия НД
MyQuery.Active := False;
finally
MyQuery.Free;
end;


 
Johnmen   (2002-07-12 15:22) [7]

>Nikolay M. © (12.07.02 15:15)

Вот только неясно, куда улетит запрос .... :)))))))))


 
flider   (2002-07-12 15:30) [8]

Re: Johnmen
Просто Close просто закрывает, а в памяти все остается и через несколько запросов идет ошибка переполнения памяти.

Re: Nikolay M.
Там же не просто select, а с условиями, которые выбирает юзер.

Re: Bay
Код кину чуть позже.



 
Johnmen   (2002-07-12 15:37) [9]

>flider (12.07.02 15:30)
>Re: Johnmen
>Просто Close просто закрывает, а в памяти все остается и через
>несколько запросов идет ошибка переполнения памяти.

Это говорит о глюкавости компонента доступа...

>Re: Nikolay M.
>Там же не просто select, а с условиями, которые выбирает юзер.

Ну формируй свой текст запроса, что мешает ?




 
fool   (2002-07-12 15:46) [10]

А ты под полученный набор данных случайно память не выделяешь(в какой нибудь класс или стринг лист не кидаешь, который потом освобождать надо)?


 
Nikolay M.   (2002-07-12 16:06) [11]


> Johnmen © (12.07.02 15:22)
>
> Вот только неясно, куда улетит запрос .... :)))))))))

Да, еще какой-нибудь DatabaseName указать не помешает :)


> flider (12.07.02 15:30)
> Re: Nikolay M.
> Там же не просто select, а с условиями, которые выбирает
> юзер.

Ну, куда же без пользователя?! :)
...
MyQuery.Text := "SELECT * FROM AnyTable WHERE UserName=" + #39 + Edit1.Text + #39;
...


 
flider   (2002-07-12 16:12) [12]

Кажется это этот кусок кода:
procedure TForm3.CreateQuery(Name: string);
begin
// Создание запроса поиска
Query1.SQL.Clear;
if (Lang.ParamRec.Params[5]=0) or (Lang.ParamRec.Params[5]=2) then
Query1.SQL.Add("delete from "+Name+"Buffer where AuditSessionID="+IntToStr(Lang.ParamRec.SessionID)+" and SearchResult="+IntToStr(Lang.ParamRec.Params[5]));
Query1.SQL.Add("insert into "+Name+"Buffer (AuditSessionID, "+Name+"ID, SearchResult) ");
Query1.SQL.Add("select "+IntToStr(Lang.ParamRec.SessionID)+", "+Name+"ID, "+IntToStr(Lang.ParamRec.Params[5])+" from "+Name+" where ");
end;

function TForm3.GetBufferCount(Name: string): integer;
begin
// Определение количества записей в буфере
Query1.SQL.Clear;
Query1.SQL.Add("select Count(*) from "+Name+"Buffer where AuditSessionID="+IntToStr(Lang.ParamRec.SessionID)+" and SearchResult="+IntToStr(SearchResult));
Query1.Open;
GetBufferCount:=Query1.Fields[0].AsInteger;
Query1.Close;
end;

procedure TForm3.CreateBegQuery(Name: string);
begin
// Формирование начала запроса для поиска в поиске
Query1.SQL.Clear;
Query1.SQL.Add("delete from "+Name+"Buffer where AuditSessionID= "+IntToStr(Lang.ParamRec.SessionID)+" and SearchResult="+IntToStr(Lang.ParamRec.Params[5]));
Query1.SQL.Add("and "+Name+"ID not in (select "+Name+"ID from "+Name+" where ");
end;

procedure TForm3.CreateEndQuery(Name: string);
begin
// Формирование конца запроса для поиска в поиске
Query1.SQL.Add(")");
Query1.SQL.Add("and "+Name+"ID in (select "+Name+"ID from "+Name+"Buffer where AuditSessionID="+IntToStr(Lang.ParamRec.SessionID)+" and SearchResult="+IntToStr(Lang.ParamRec.Params[5])+")");
end;

procedure TForm3.ShowQueryRezult(Name: string; SortCond: string; RTabSheet, LTabSheet: TTabSheet; RQuery, LQuery: TQuery;
PageControl: TPageControl; RStatusBar, LStatusBar: TStatusBar; var SRCount, ListCount: integer);
var RecCount: integer;
begin
// Вывод на экран результатов поиска
Query1.ExecSQL;
if SearchResult>0 then
begin
SetSearchResult(2);
if LQuery.Active then LQuery.Close;
LQuery.SQL.Clear;
LQuery.SQL.Add("select * from V_"+Name);
if SortCond<>"" then LQuery.SQL.Add(SortCond);
LQuery.Open;
PageControl.ActivePage:=LTabSheet;
RecCount:=GetRecCount(LQuery);
ListCount:=RecCount;
LStatusBar.Panels[0].Text:="Количество записей: "+IntToStr(RecCount);
end
else
begin
SetSearchResult(0);
if RQuery.Active then RQuery.Close;
RQuery.SQL.Clear;
RQuery.SQL.Add("select * from V_"+Name);
if SortCond<>"" then RQuery.SQL.Add(SortCond);
RQuery.Open;
PageControl.ActivePage:=RTabSheet;
RecCount:=GetRecCount(RQuery);
SRCount:=RecCount;
RStatusBar.Panels[0].Text:="Количество записей: "+IntToStr(RecCount);
end;
end;


 
dimis   (2002-07-12 16:20) [13]

у меня тоже такое происходило
код
Query1.Close;
Query1.Open;
Query1.Close;
Query1.Open;
Query1.Close;
Query1.Open;
(обратите внимание многоточий нет)
достаточно быстро съедал всю память.
Query1.Free - тоже не помогало. После того как ушел от BDE все встало на свои места


 
flider   (2002-07-12 16:22) [14]

Re: dimis
Как это грустно! У нас все именно с BDE и никак иначе. А может это все-таки лечится?


 
BAY   (2002-07-12 17:38) [15]

Хотя да, припоминаю. Такое было. Я думал я что-то не то делаю: каждые полчаса перезагружался. И действительно, когда перестал пользоваться BDE этой ошибки больше не было.


 
Desdechado   (2002-07-13 15:28) [16]

а БДЕ какой версии?
может, поновее с борланда выкачать?


 
flider   (2002-07-14 13:36) [17]

BDE с 4 дельфей.
То есть программно точно не лечится?


 
flider   (2002-07-14 14:12) [18]

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


 
flider   (2002-07-15 12:57) [19]

А как можно уйти от BDE?


 
sniknik   (2002-07-15 13:45) [20]

тут похоже не бде виновато, вот код (чисто SQL-ный) который делает то же самое (сьедает память и хендлы в виндах)

EXEC sp_addlinkedserver
@server = "MYDBFs",
@provider = "Microsoft.Jet.OLEDB.4.0",
@srvproduct = "OLE DB Provider for Jet",
@datasrc = "D:\Base",
@provstr = "dBASE IV"

DECLARE @i int
SET @i = 1
WHILE @i < 1000 BEGIN
IF EXISTS (SELECT * FROM sysobjects WHERE (name = N"CashSail"))
BEGIN
INSERT INTO CashSail
SELECT * FROM mydbfs...CashSail
END ELSE BEGIN
SELECT * INTO CashSail
FROM mydbfs...CashSail
CREATE INDEX CashIndex ON CashSail (CashNumber)
CREATE INDEX ZIndex ON CashSail (ZNumber)
END
SET @i = @i + 1
PRINT @i
END

при выполнении в Querry Analizer-е виснет изза нехватки памяти на ~ 900-м запросе
с ошибкой
Server: Msg 7399, Level 16, State 1, Line 6
OLE DB provider "Microsoft.Jet.OLEDB.4.0" reported an error. The provider did not give any information about the error.

это мне вылечить не удалось. линк через ODBC работает нормально.
(уйдеш от BDE и попадеш в другую ж...у, уууу :-)


 
roottim   (2002-07-15 13:50) [21]

а причем тут Jet


 
sniknik   (2002-07-15 13:52) [22]

ни при чем. просто уходя от одних гемороев обычно попадаеш в другие.


 
Johnmen   (2002-07-15 13:56) [23]

Как же у вас, поклонников MSSQL, всё запущено...:)))))


 
roottim   (2002-07-15 13:58) [24]

я к тому что SP написана для MSSQL
к нему oledb for sqlserver..
а накой тут jet!


 
sniknik   (2002-07-15 14:04) [25]

Johnmen ©
Точно. Всем!!! переходите на Pervasive, вот где я проблем не встречал (глобальных). а с sql вообще просто что написал то и получиш. и ошибки только описанные в доках получаются :-).

а вообще извиняюсь за то что сбил с темы %-(


 
flider   (2002-07-15 14:31) [26]

Не, это не тот случай. Здесь просто нет закрытия процедуры,пока она не будет полностью выполнена, а запрос весьма приличный и на каждой машине,в зависимости от параметров, будет срываться на разных повторах, а на крутой машине выполнится полностью.
У нас ситуация иная - запросы-то в программе закрываются Close-ом, и, теоретически, должны полностью уничтожаться по закрытии. Но этого не происходит. Они продолжают где-то висеть в памяти.
И потом, хранимые процедуры SQL одни и те же в современной и в старой версии приложения, различия только в дельфячьей оболочке. И в старой версии все работает, а в новой - рушится.


 
Johnmen   (2002-07-15 14:45) [27]

Дельфи - не оболочка, а средство разработки. Поэтому дело не в Дельфях.


 
flider   (2002-07-15 14:58) [28]

Re: Johnmen
Я имела в виду оболочка - приложение, сделанное в дельфях, для работы со SQL-ной базой.
Все-таки дело именно в дельфячьем коде, а не в SQL-ном, поскольку, повторюсь, хранимые процедуры не менялись, в отличие от того, что было написано в Дельфях.


 
Johnmen   (2002-07-15 15:06) [29]

И версия MSSQL не менялась ?
И драйвера(прослойки) доступа не менялись ?


 
flider   (2002-07-15 15:10) [30]

Нет, ПО все то же самое, что и на старой версии.


 
Johnmen   (2002-07-15 15:22) [31]

Позволь тебе не поверить. :)
Меняя версию Дельфей ты меняла версию прокладки - BDE.


 
flider   (2002-07-15 15:27) [32]

Я не меняла версию дельфей. Как были 4 с одного и того же диска, так и ставили.


 
Johnmen   (2002-07-15 15:37) [33]

Тем не менее, если ничего, кроме самой программы (кода) не менялось, то это проблема не Дельфей !!!


 
flider   (2002-07-15 15:45) [34]

А чего? Мне казалось, что если было что-то написано и оно работало, потом было утеряно, а потом попытались восстановить, но оно не работает, то дело именно в коде - не так воспроизвели. Самое обидное, что восстанавливаем-то уже почти два года. Это была практически окончательная версия, и вдруг такая хрень выплыла. Надо что-то делать, а что - непонятно.


 
fool   (2002-07-15 17:47) [35]

Послушал я вас всех: даже не знаю че думать(а пока слушал делал Close - Open). Так вот у меня MDIForm делала себе MDIChild-а раз сорок(потом ему caFree), каждый раз тянулся запрос (около 2М), при Show - открывал нужные Query(14 шт.), а при Close - закрывал(вручную все по порядку). Mem Usege после процедуры Open-Close оставался одинаков (+- 4К). Все через BDE (MSSQL). Так что думаю дело не в BDE.

Делал так:

procedure OpenQueries;
begin
if not Q1.Active then Q1.Open;
...
if not Q14.Active then Q14.Open;
end;

procedure CloseQueries;
begin
if Q1.Active then Q1.Close;
....
if Q14.Active then Q14.Close;
end;


 
flider   (2002-07-15 17:57) [36]

Re: fool

Интересная мысль! Дело в том, что у нас используется не MDI-схема. Может быть дело в этом? Если перейти на MDI все заработает? Какова вероятность этого?


 
fool   (2002-07-15 18:27) [37]

Вероятность есть, но при использовании MDI тоже внимательно следи за высвобождением ресурсов, я использую такую схему:
/// Ето по некоему событию в папе
if MDIFrm = nil then MDIFrm := TMDIFrm.Create(self);
MDIFrm.WindowState := wsMaximized;
MDIFrm.Show;
/// А ето в чилде
procedure TMDIFrm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
MDIFrm.CloseQueries;
Action := CaFree;
end;

procedure TMDIFrm.FormShow(Sender: TObject);
begin
MDIFrm.OpenQueries;
end;

procedure TMDIFrm.FormDestroy(Sender: TObject);
begin
MDIFrm := nil;
end;

procedure TFrmAgree.OpenQueries;
begin
end;

procedure TFrmAgree.CloseQueries;
begin
end;


 
fool   (2002-07-15 18:29) [38]

Извините, опечатка (не FrmAgree, а MDIFrm)


 
flider   (2002-07-15 19:04) [39]

Re: fool
Спасибо! А вот такой вопрос: у нас не используется уничтожение формы. Схема такая - SpeedButton на родительской форме, а под ними TabControl (или PageControl, не знаю) - на дочерней. На первой закладке пользователь может задавать параметры поиска. После нажатия на кнопку "Поиск", результат поиска выводится на вторую закладку. При повторном нажатии на Поиск, управлять очисткой памяти будет родительская форма?



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

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

Наверх





Память: 0.69 MB
Время: 0.039 c
14-13802
Baz
2002-07-11 12:52
2002.08.05
NEWSGROUPS, USENET, NNTP etc


3-13555
Aleksandr
2002-07-15 12:28
2002.08.05
Скажите, специалисты по потокам, где эта структура незащищена?


1-13595
Schema
2002-07-24 16:21
2002.08.05
перевод строки


1-13702
AndreiKvin
2002-07-23 15:48
2002.08.05
Что выполняется быстрее


14-13775
[NIKEL]
2002-07-08 18:34
2002.08.05
А где, собственно, IronHawk ? :)))





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский