[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

pl.comp.programming

ADO, postgresql - problemy z pamiecia

hazet

8/2/2007 4:47:00 PM

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

8 Answers

Morff

8/2/2007 4:54:00 PM

0

Pytanie podstawowe brzmi :
PO CO
sciagasz wszystkie dane z serwera na klienta ?

Po3?czenie sie czesto zrywa ? musisz sortowac du?a ilosc danych na
wszystkie sposoby ? naprawde nie przychodzi mi do g3owy 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

8/2/2007 5:06:00 PM

0

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

8/2/2007 5:18:00 PM

0


> 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 ogladaa 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 ogladaa.
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
zmusia usera zeby zapyta3 o to co chce zobaczyc ?

--
Pozdrawiam
Morff
--------------------
AQQ 141151

hazet

8/2/2007 6:14:00 PM

0

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

8/3/2007 7:44:00 AM

0

Dnia 02-08-2007 o 20:13:38 hazet <hazet@os.pl> napisa3:

> 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 spe3niaj? 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 po3ozony na formie i
nie zci?gajacy zawartosci ca3ej tabeli) ...

--
Pozdrawiam
Morff
--------------------
AQQ : 141151 (morff@aqq.eu)

Bronek Kozicki

8/5/2007 10:11:00 PM

0

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 spe3niaj? 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?ga3aby tylko dane dla wierszy widocznych w danym momencie, plus ew.
bufor na nastepn?/poprzedni? strone.


B.


hazet

8/6/2007 9:22:00 AM

0

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

8/11/2007 4:32:00 PM

0

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.