Mam pytanie do osób, które na co dzień zajmują się ERP Optimą.
W jaki sposób z poziomu aplikacji .net (korzystającej z API Optimy) można zwolnić z pamięci obiekty COM? Chodzi np. o pobrane "CDNTwrb1.Towar" itp.
Mam pytanie do osób, które na co dzień zajmują się ERP Optimą.
W jaki sposób z poziomu aplikacji .net (korzystającej z API Optimy) można zwolnić z pamięci obiekty COM? Chodzi np. o pobrane "CDNTwrb1.Towar" itp.
Co dla ciebie znaczy "zwolnić z pamięci"? Chodzi o session.Save()
?
Pobieram produkt w poniższy sposób:
productsOptima = (CDNTwrb1.Towary)_session.CreateObject("CDN.Towary", null);
productOptima = productsOptima["Twr_TwrId=" + id] as CDNTwrb1.Towar;
Przy pobraniu 1000 produktów pamięć przyrasta do 1GB. Nic nie zapisuje. Tylko odczytuje.
Co by w tym przypadku zrobiło session.Save() ?
Po pierwsze:
productOptima = (CDNTwrb1.Towar)_session.CreateObject("CDN.Towary", "Twr_TwrId = " + id);
Po drugie, dlaczego pobierasz towary obiektami COM? Nie lepiej przez SQL? I po trzecie, twoje pobieranie towarów nie musi zapychać pamięci. Możesz mieć babola gdzieś indziej
Akurat to nie ja pisałem implementację, ale sądzę, że tak było wygodniej bo pobierane są różne powiązane obiekty jak grupy, ceny czy języki.
Jeśli chodzi o babola gdzie indziej to sprawdziłem, że to po pobraniu produktu przyrasta pamięć o około 1.5MB i nie mogę jej w żaden sposób zwolnić.
Przy pobieraniu około 3000 produktów w ten sposób wylatuje proces
a tak? Marshal.ReleaseComObject(Object)
WeiXiao napisał(a):
a tak?
Marshal.ReleaseComObject(Object)
Niestety próbowałem....
Ratuje cię tylko odnawianie sesji przy każdej próbie pobrania towaru:
AdoSession session = loginService.LoginInfo.CreateSession();
Towary products = (Towary)session.CreateObject("CDN.Towary");
Towar product = (Towar)products["Twr_TwrId = " + id];
//Tu się coś z tym towarem robi...
session.Save();
AdamWox napisał(a):
Ratuje cię tylko odnawianie sesji przy każdej próbie pobrania towaru:
AdoSession session = loginService.LoginInfo.CreateSession(); Towary products = (Towary)session.CreateObject("CDN.Towary"); Towar product = (Towar)products["Twr_TwrId = " + id]; //Tu się coś z tym towarem robi... session.Save();
Widzę, że przy każdo razowym odnawianiu sesji pamięć nie przyrasta - również bez użycia session.Save()