Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Как то странно ADO работает: / 9 сообщений из 9, страница 1 из 1
12.07.2003, 19:17
    #32206397
AndreyBond
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как то странно ADO работает:
Это опять я странно жрётся оперативка и что то в простой задаче (однотредовой по замаслу) тредов много вот код, в коментариях написано кол-во тредов и сколько памяти кушается после выполнения строчки:
program Project1;
{$APPTYPE CONSOLE}
uses
SysUtils, Classes, ADODb, ActiveX;
Var
MySQL:TADOCommand;
begin
readln; //ОП: 1620 кб, Тредов:1
CoInitialize(nil); //ОП: 1664 кб, Тредов:1
MySQL:=Tadocommand.Create(nil); //ОП: 2432 кб, Тредов:2
MySQL.ConnectionString:='Строчка для коннекта к базе'; //ОП: 2440 кб, Тредов:2
MySQL.CommandText:='insert into proverka values(1,''Проверка')'; //ОП: 5620 кб, Тредов:7 !!!!!!!!!!!!!!!!!!!!!!!
MySQL.Execute; //ОП: 5692 кб, Тредов:7
MySQL.free;
MySQL:=nil; //ОП: 5696 кб, Тредов:7
CoUninitialize; //ОП: 5720 кб, Тредов:7
readln; //строчка конечно же выполняется после нажатия Enter ОП: 5756 кб, Тредов:5
end.

Всё бы ничего, если бы после освобождения обьекта (MySQL.Free) память бы освобождалась и кол-во тредов обратно к еденице возвращалось. В чём дела, почему этого не происходит после освобождения обекта TADOCommand?
...
Рейтинг: 0 / 0
12.07.2003, 19:19
    #32206398
AndreyBond
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как то странно ADO работает:
Ещё раз, чтобы попонятней код был:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
program Project1;
{$APPTYPE CONSOLE}
uses
  SysUtils, Classes, ADODb, ActiveX;
Var
  MySQL:TADOCommand;
begin
  readln;                                         //ОП:  1620  кб, Тредов: 1 
  CoInitialize(nil);                             //ОП:  1664  кб, Тредов: 1 
  MySQL:=Tadocommand.Create(nil);  //ОП:  2432  кб, Тредов: 2 
  MySQL.ConnectionString:='Строчка для коннекта к базе';   //ОП:  2440  кб, Тредов: 2 
  MySQL.CommandText:='insert into proverka values(1,''Проверка')'; //ОП:  5620  кб, Тредов: 7         !!!!!!!!!!!!!!!!!!!!!!!
  MySQL.Execute;                           //ОП:  5692  кб, Тредов: 7 
  MySQL.free;
  MySQL:=nil;                                //ОП:  5696  кб, Тредов: 7 
  CoUninitialize;                             //ОП:  5720  кб, Тредов: 7 
  readln; //строчка конечно же выполняется после нажатия Enter ОП:  5756  кб, Тредов: 5 
end.
...
Рейтинг: 0 / 0
13.07.2003, 19:43
    #32206571
Mik Prokoshin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как то странно ADO работает:
Вероятно, это связано с пулингом - сохранением connection'ов в кеше. Через некоторое время все (или почти все) освободит. Проверь :-)
...
Рейтинг: 0 / 0
13.07.2003, 22:34
    #32206605
AndreyBond
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как то странно ADO работает:
Час прождал, ничего не поменялось....
Как было 7 тредов и 5 слишним мегов оперативки, так и осталось...
Интересное наблюдение:
Если окошко свернуть в начале проги, то от 4мегов остаётся 120 кб. Потом разворачиваешь его, так и остаётся 120, нажимаем Enter, происходит вставка записи, теперь 7 тредов и оперативки кушается почти под 5мегов. Опять сворачиваем, теперь приложение занимает 144 кбайта (но теже 7 тредов остаётся), разворачиваем, те же 144 кбайта и 7 тредов. Может кто нить обьяснит эти особенности, почему так всё странно с памятью работает.

З.Ы. Не зависимо от того есть ли в программе строчки:
MySQL.free;
MySQL:=nil;
При сворачивании разворачивании наблюдаются одни и теже числа с памятью и тредами. Вообще изучил поведение с этими строчками и без них, такое ощущение, что они ни как не влияют. А я всегда думал, что нужный компонент всегда лучше создавать динамически, а не кидать на форму во время проектирования, и когда он не нужен уничтожать его, экономишь так ресурсы, а оказывается толку от этого никакого.
...
Рейтинг: 0 / 0
14.07.2003, 12:18
    #32206947
aag
aag
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как то странно ADO работает:
Память возвращается не когда заканчивается приложение, а когда свободная память обратно требуется ОС. До того времени она остается как-бы зарезервирована за прилож. - на случай повторного использования. Т.е. с памятью у тебя ситуация м.б. нормальна. Посмотри, как Ворд память захватывает и возвращает.
...
Рейтинг: 0 / 0
15.07.2003, 09:13
    #32207856
AndreyBond
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как то странно ADO работает:
И с кол-вом тредов тоже всё в порядке, и они убьются когда ресурсов процессора не будет хватать?
...
Рейтинг: 0 / 0
15.07.2003, 12:03
    #32208114
Dimastyi
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как то странно ADO работает:
Такая же проблема, только коннекты к БД делаю из потока (thread'a).
Поток завершается, а память остается занятой. Ждать можно часами, память не возвращается. Следующие запуски потока отъедают новые объемы памяти. Свернув окошко приложения, получаю тот же эффект.
Если приложение работает длительное время, свободной памяти вообще не остается. Это приводит к остановке работы потока. Пробовал настройки connection pooling - не помогло.

Что же делать?
...
Рейтинг: 0 / 0
16.07.2003, 12:12
    #32209507
AndreyBond
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как то странно ADO работает:
Я кстати, тоже самое делаю, там ниже есть мой пост ADO и Thread. Я думал это проблемы в моём потоке, и написал простое однопоточное приложение, которое точно так же работает как мой отделный поток, и увидел что прога эта ведёт себя так же как и с потоком, поэтому привёл пример простейшей проги, так как подумал если проблему решу в этой проге, то и решу в потоке, но как видно, похоже решений нет.
...
Рейтинг: 0 / 0
17.07.2003, 13:59
    #32210918
Dimastyi
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как то странно ADO работает:
У меня в одном потоке происходит коннект к Oracle и MSSQL server.
Оказалось, что память пожирается после коннекта к Oracle. При коннекте к MSSQL все работает нормально. Я решил для коннекта к Oracle вместо ADO пользовать DOA, а для MSSQL оставил ADO, все заработало нормально. Когда я пользовал ADO для Oracle, каждый пуск потока пожирал очередные 400K. Наверное, в ADO есть какой-то глюк при установке связи с Oracle.

Сейчас память отжирается до определенного предела (видимо, сколько надо приложению), потом процесс прекращается . Если открыть какие-нибудь другие приложения, например, Outlook, то программа отдает некоторую часть памяти.
Таким образом, формулируем резюме: если твои потоки постоянно при каждом их пуске не отъедают большой кусок памяти, а делают это только до определенного предела, то это нормально.

Для того, чтобы нигде не вызывать CoInitializе и CoUn..., добавь в главный модуль приложения (на Delphi, я думаю, похоже):

#include <comobj.hpp>

а в теле перед Application->Initialize() напиши

CoInitFlags = 0;
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Как то странно ADO работает: / 9 сообщений из 9, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]