ADO, postgresql - problemy z pamiecia
hazet - 03-08-2007 09:28
ADO, postgresql - problemy z pamiecia
Witam,
Mam dziwny problem. Napisalem aplikacje w Turbo C++ laczaca sie z postresql za pomoca komponentow ADO. Po uruchomieniu aplikacja zajmuje w pamieci ponad 120MB! Nie wiem co jest przyczyna. Na formularzu DataModule mam: Obiekt TADOConnection, 5 obiektow TADODataset i 9 komponentow TADOCommand(dla kazdej tabeli mam 3 komponenty -ADODataSet do pobierania danych ADOCommand z parametrami do wstawiania wiersza i jeszcze jeden ADOCommand do updatowania rekordu). Problem polega na tym iz nawet gdy nie ma w tabeli duzo rekordow to program zajmuje w pamieci od 120-160MB, co jest raczej nienormalne dla takiego programu? Mam na glownym formularzu DBGrida, i w zaleznoci jaka zakladke klinkniel uzytkownik to komponentowi DataSource przypisuje dany DataSet danej tabeli, DBGrid jest ustawiony na datasource. W przypadku gdy nie pobieram zadnych danych do datasetow to program zajmuje ok 9MB. Sadze ze problem moze byc w tym iz po prostu dane z tabeli tyle zajmuja, mam tabele: CREATE TABLE tab1 ( id serial NOT NULL PRIMARY_KEY, pole1 character varying(255) NOT NULL, pole2 character varying(255) NOT NULL, pole3 real NOT NULL, pole4character varying(255) NOT NULL, pole5 character varying(100) NOT NULL, pole6 character varying(255), pole7 character varying(255) NOT NULL, pole8 character varying(255), pole9 character varying(255), pole10 character varying(255), pole11 integer NOT NULL, pole12 integer NOT NULL, pole13 real NOT NULL, pole14 real NOT NULL, pole15 character varying(100) );
CREATE TABLE tab2 ( id serial NOT NULL PRIMARY KEY, tab1_id integer NOT NULL REFERENCES tab1(id), -- klucz obcy z tabeli 1 pole1 real NOT NULL, pole2 real NOT NULL, pole3 integer NOT NULL, pole4 integer NOT NULL, )
w tabeli 1 mam nie duzo rekordow(np 2, 3), natomiast w tab2 jest ich ok 190 i stanowia relacje z tab1. lacze te tabele left joinem SELECT * FROM tab1 LEFT JOIN tab2 ON tab1.id = tab2.tab1_id ORDER BY tab1.id
Mam oprocz tego jeszcze 3 mniejsze tabele.
Mozliwe jest zeby przy takiej ilosci danych po zapytaniu dane w datasecie tyle zajmowaly? Nie moge zamiast varchar zastosowac typu text poniewaz przy uzyciu komonentow ADO DBGrid nie wyswietla takich napisow prawidolowo(zamiast tekstu wyswietla sie WIDEMEMO). Co moze byc przyczyna takiej pamieciochlonnosci i jak ewentualnie moge sobie z tym poradzic? Nie jest to przeciez duza ilosc danych
PS. Mam jeszcze pytanie czy da sie jakos przyspieszyc dzialanie komponentow ADO poniewaz pobieranie danych z bazy dosyc dlugo trwa.
pozdrawiam
Morff - 03-08-2007 09:28
Pytanie podstawowe brzmi : PO CO sciagasz wszystkie dane z serwera na klienta ?
Połączenie sie czesto zrywa ? musisz sortowac duża ilosc danych na wszystkie sposoby ? naprawde nie przychodzi mi do głowy zaden powód dla którego trzeba dane z kilku tabel przepychac pomiedzy serwerem a klientem.
jak odpowiesz na to pytanie , to sie zastanowimy nd resztą.
-- Pozdrawiam Morff -------------------- AQQ 141151
hazet - 03-08-2007 09:28
On 2 Sie, 18:53, Morff <mor...@wp.pl> wrote: > Pytanie podstawowe brzmi : > PO CO > sciagasz wszystkie dane z serwera na klienta ? > > Po czenie sie czesto zrywa ? musisz sortowac du a ilosc danych na > wszystkie sposoby ? naprawde nie przychodzi mi do g owy zaden powód dla > którego trzeba dane z kilku tabel przepychac pomiedzy serwerem a klientem. > > jak odpowiesz na to pytanie , to sie zastanowimy nd reszt . > > -- > Pozdrawiam > Morff > -------------------- > AQQ 141151
To znaczy, serwer postgresql dziala tutaj jako lokalna baza danch. A dane sciagam poniewaz chce je wyswietlic na DBGidzie w oknie glownym w zaleznosci ktora tabele chce przegladac uzytkownik.
pozdrawiam
Morff - 03-08-2007 09:28
> To znaczy, serwer postgresql dziala tutaj jako lokalna baza danch. A > dane sciagam poniewaz chce je wyswietlic na DBGidzie w oknie glownym > w zaleznosci ktora tabele chce przegladac uzytkownik. > > pozdrawiam
nadal nie widze powodu dla którego uzywasz adodataset zamiast adoquery z kursorem po stronie serwera. To ze uzytkownik chce ogladać jakąś tabele to nie powód zeby mu zciagac wszystkie dane do aplikacji. wystarczy JEDNO ado query , podpiąc datasource + dbgrid , a query modyfikowac w zależnosci od tego którą tebele chce user ogladać. Po drugie user nie widzi tysiąca rekordów w gridzie tylko jakąś ograniczoną ilosc ... po co wiec zciagac tysiące rekordów, nie lepiej zmusić usera zeby zapytał o to co chce zobaczyc ?
-- Pozdrawiam Morff -------------------- AQQ 141151
hazet - 03-08-2007 09:28
On 2 Sie, 19:17, Morff <mor...@wp.pl> wrote: > > To znaczy, serwer postgresql dziala tutaj jako lokalna baza danch. A > > dane sciagam poniewaz chce je wyswietlic na DBGidzie w oknie glownym > > w zaleznosci ktora tabele chce przegladac uzytkownik. > > > pozdrawiam > > nadal nie widze powodu dla którego uzywasz adodataset zamiast adoquery z > kursorem po stronie serwera. > To ze uzytkownik chce oglada jak tabele to nie powód zeby mu zciagac > wszystkie dane do aplikacji. > wystarczy JEDNO ado query , podpi c datasource + dbgrid , a query > modyfikowac w zale nosci od tego któr tebele chce user oglada . > Po drugie user nie widzi tysi ca rekordów w gridzie tylko jak > ograniczon ilosc ... po co wiec zciagac tysi ce rekordów, nie lepiej > zmusi usera zeby zapyta o to co chce zobaczyc ? > > -- > Pozdrawiam > Morff > -------------------- > AQQ 141151
ADOQuery tak jak i ADODataset maja pole - CursorLocation, mozna ustawic tez dla ADODatasetu na clUseServer. Chyba ze ADOQuery jest sam w sobie znacznie szybszy od ADODataseta???/ Zamienilem dataseta na adoquery ustawilem kursor na clUseServer, chyba nie zajmuje tyle pamieci ale nie mozna z tak ustaionym kursorem robic tego co z kursorem po stronie klienta, ponadto podczas proby podpiecia datasource do adoquery dostalem wyjatek: Exception class EDatabaseError with message 'Dataset does not support bookmarks, which are required for multi-record data controls'. Moze trzeba zmienic jeszcze pole CursorType? Przy ustawionym CursorLocation na clUseClient nie bylo wyjatku.
> wystarczy JEDNO ado query , podpi c datasource + dbgrid , a query > modyfikowac w zale nosci od tego któr tebele chce user oglada . Co do tego czy zastosowac jeden czy wiele komponentow, to w programie jest jeszcze opcja dostepu do tabel z poziomu innych formularzy tzn. jezeli na DBGridzie jest akurat aktywna tabelaA to user i tak moze otworzyc formularz korzystajacy z innej tabeli, jak bym zastosowal jeden dataset to musialbym usunac to co aktualnie jest w dbgridzie. W pozostalych komponentach ADOCommand mam wpisane parametry do zapytan insert oraz update.
> Po drugie user nie widzi tysi ca rekordów w gridzie tylko jak > ograniczon ilosc ... po co wiec zciagac tysi ce rekordów, nie lepiej > zmusi usera zeby zapyta o to co chce zobaczyc ? Jasne tutaj sie zgadzam, chce zrobic oczywiscie filtry do wyszukiwania, ktore beda zawezaly wyniki, opcja z ograniczeniem ilosci wierszy jest dobrym pomyslem
dzieki, pozdrawiam
Morff - 03-08-2007 09:28
Dnia 02-08-2007 o 20:13:38 hazet <hazet@os.pl> napisał:
> Jasne tutaj sie zgadzam, chce zrobic oczywiscie filtry do > wyszukiwania, ktore beda zawezaly wyniki, opcja z ograniczeniem ilosci > wierszy jest dobrym pomyslem
nie filtry ... zapytanie z parametrami ... Zanim wyświetlisz rekordy poproś usera o podanie warunków zapytania .. Jezeli nie poda warunków lub poda warunek który spełniają wszystkie rekordy .. to niech czeka.
Generalnie ... przemyśl jeszcze raz projekt aplikacji - pomyśl czy nie powinieneś otwierac formy z pustym gridem i nie wymusic na userze w ten sposób podania warunków dla zapytania , nie otwierac wszystkich datasetów przy otwieraniu aplikacji , tylko otwierac te które sa potrzebne . Powiązac odpowiednie datasety z formularzami (dataset połozony na formie i nie zciągajacy zawartosci całej tabeli) ...
-- Pozdrawiam Morff -------------------- AQQ : 141151 (morff@aqq.eu)
Bronek Kozicki - 06-08-2007 00:01
Morff <morff1@wp.pl> wrote: > zapytanie z parametrami ... Zanim wyświetlisz rekordy poproś usera o > podanie warunków zapytania .. > Jezeli nie poda warunków lub poda warunek który spełniają wszystkie > rekordy .. to niech czeka.
nie wiem jak to jest w tej konkretnej bibliotece, ale przecież użytkownik na raz nie *widzi* tysiąca rekordów. Sprytna biblioka ściągałaby tylko dane dla wierszy widocznych w danym momencie, plus ew. bufor na następną/poprzednią stronę.
B.
hazet - 07-08-2007 00:01
On 6 Sie, 00:11, "Bronek Kozicki" <b...@spam-trap-cop.net> wrote: > Morff <mor...@wp.pl> wrote: > > zapytanie z parametrami ... Zanim wy wietlisz rekordy popro usera o > > podanie warunków zapytania .. > > Jezeli nie poda warunków lub poda warunek który spe niaj wszystkie > > rekordy .. to niech czeka. > > nie wiem jak to jest w tej konkretnej bibliotece, ale przecie > u ytkownik na raz nie *widzi* tysi ca rekordów. Sprytna biblioka > ci ga aby tylko dane dla wierszy widocznych w danym momencie, plus ew. > bufor na nast pn /poprzedni stron . > > B. No wlasnie ADO nie jest takie sprytne, tak dziala chyba BDE przynajmiej mi sie tak wydaje.
pozdrawiam
Bronek Kozicki - 12-08-2007 00:07
hazet wrote: > No wlasnie ADO nie jest takie sprytne, tak dziala chyba BDE > przynajmiej mi sie tak wydaje.
ADO nie ma grida; to jest sprawa GUI
B.
-- Remove -trap- when replying. Usun -trap- gdy odpisujesz.
zanotowane.pldoc.pisz.plpdf.pisz.pleffulla.pev.pl
|
[MSSQL2000] Problem z =?ISO-8859-2?Q?tabel=B1/indeksem/zapytanie?==?ISO-8859-2?Q?m_czy_b=B3=B1d_w_bazie_danych=2E=2E=2E?=
mysql i mysql-front, problem
String line; if (line=="cos"){...}....problem
[oracle] =?ISO-8859-2?Q?zmia=BFd=BFony_przez_problem=3A_za?==?ISO-8859-2?Q?pytanie_do_hierarchi?=
[PostgreSQL] - jak =?ISO-8859-2?Q?zabezpieczy=E6_interesy_tw?==?ISO-8859-2?Q?=F3rcy_systemu_=3F=3F=3F?=
postgresql - int/int
Problem z wartościami w MySQL :( [ MySQL and ASP and VBScript ]
[PGSQL] czy ktos mial problemy z initdb pgsql 8.1 ?
[MySQL] Problem z zapisem danych w bazie danych
Problem z mysql - can't connect to MySQL/nietypowo...
zanotowane.pldoc.pisz.plpdf.pisz.plnawschodzie.xlx.pl
Cytat
Decede mihi sole - nie zasłaniaj mi słonca. Gdy kogoś kochasz, jesteś jak stworzyciel świata - na cokolwiek spojrzysz, nabiera to kształtu, wypełnia się barwą, światłem. Powietrze przytula się do ciebie, choćby był mróz, a ty masz w sobie tyle radości, że musisz ją rozdawać wokoło, bo się w tobie nie mieści Hoc fac - tak czyń. A tergo - od tyłu; z tyłu. I czarne włosy posiwieją. Safona |
|