Stálé spojení ASP.NET aplikace s MSSQL databází   zodpovězená otázka

ASP.NET WebForms, Databáze

Dobrý den, mám dotaz ohledně stálého spojení s databází.

Provozuji vnitropodnikovou ASP.NET aplikaci, a zjistil jsem, že neustálé otevírání a uzavírání connection velmi zpomaluje chod aplikace. Na tomto webu jsem se dočetl, že je dobré spojení s databází ihned po provedení dotazu uzavírat a tak jsem i postupoval, ale nyní mám například miniatury fotek uživatelů uložené v databázi a při výpisu článků i s fotografiemi uživatelů trvá stahování fotek velmi dlouho. Ne snad proto, že by byly fotky velké, ale protože se u každé fotky otevírá nové spojení a po stažení obrázku zase uzavírá.

Napadlo mě, zda by nebylo možné otevřít si spojení například v global_asax při události application_start ??? Je v tom nějaké omezení mít takto otevřené jedno spojení pro celý chod aplikace včetně webových služeb pro všechny přihlášené uživatele?

Jen v tomto případě nevím kdy bych ono spojení uzavíral, protože ne vždy dojde k vyvolání události application_end...

Předem díky za vaše názory...

Petr

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Pokud spojení otevíráte a zavíráte až moc často, tak půjde spíše o chybu návrhu a použitého kódu v rámci aplikace. Řešit otevírání a zavírání spojení na úrovni global nastavení mi nepřijde vhodné

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Zdravím, vy mi radíte nemít global propojení s databází ale nadruhou stranu říkáte otevírat a zavírat spojení často je chybou návrhu aplikace. Jak by jste tedy například ten problém se stahováním fotek z db řešil?

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Spojení bych otevřel na dobu nutnou k úkonu, tj. ke stažení všech požadovaných informací/dat - ne stahovat po jednom s tím, že s každým "kouskem" se spojení obnovuje . pokud byste to takto dělal například pro reporting, tak utavíte jak databázi , tak i samotnou app.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

OK, a jak byjste tedy řešil ten konkrétní příklad, když máte fotky v db?

Aplikace vygeneruje html stránku s tabulkou článků. V každém řádku tabulky je tag "img" s atributem src="/fotka.aspx?UserID=Já". Aplikace se připojí na fotka.aspx, tak v události page_load otevře spojení, stáhne fotku z databáze, uzavře spojení.

Jak by jste toto řešil aby spojení s databází pro stažení "x" fotek zůstalo otevřené ale neotvírat to na globální úrovni aplikace. Právě této části nerozumím...

Petr

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Stálé spojení s DB se nedoporučuje např. z toho důvodu, že současně se lze připojit jen určitým počtem těch "spojení". Když se tento počet vyčerpá, další už se nepřipojí. Nehledě k tomu Vás SQL server stejně po určité době nečinnosti, tzn. bez dotazování do DB sám odpojí a v tu chvíli by aplikace asi přestala fungovat a vyhazovala by chyby spojení... Navázání spojení je v řádu milisekund, takže jestli se Vám fotky stahují dlouho, bude chyba patrně někde jinde, určitě to není tím, že se otevírá a zavírá connection.

Kolik máte těch fotek v souboru fotka.aspx najednou zobrazovat?

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Doporučil bych ti je vyexportovat z DB na WebServer a zapomenout, že něco takového jako nahrát soubor do DB jde :) ... dlouho jsem neviděl čuňárnu typu obrázek v DB.

Obrázky a ani jiné blob statické věci nemají co v DB pohledávat, zabírají místo v DB a je to skok do průseru...

Většina hodně vytížených serverů má dokonce vyhrazený servery pro statický (neměnný) obsah - css, obrázky, javascript (.js) atd.

Věřím, že fotky "přispivatelů" se zase tak často nemění...

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Chcete říct, že při načítání stránky, kde bude třeba 50 řádků v tabulce se 50x otevře a uzavře spojení?

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Při načítání stránky se otevře spojení, načte se těch 50 řádků a spojení se zase uzavře...

A ty fotky máte skutečně uloženy v DB??? nebo je v DB jen odkaz na nějaké místo, odkud se ty fotky pak načítají?

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Opravdu je mám uložené v DB, ale přemýšlím o tom (viz ostatní příspěvky), že od toho upustím...

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Opravdu doporučuji od toho upustit, protože si s tím přiděláváte zbytečně moc práce. Fotky, stejně jako i ostatní soubory se dávají někam do adresáře a do DB se dává odkaz na místo, kde jsou...

nahlásit spamnahlásit spam 0 odpovědětodpovědět

.NET Framework využívá tzv. connection pooling, takže by samotné otevírání/zavírání připojení trvat nemělo. Toto téma se zde již řešilo několikrát, koukněte se například na odkazy:

http://www.dotnetportal.cz/forum/tema/26...

http://www.dotnetportal.cz/forum/tema/26...

http://www.dotnetportal.cz/forum/tema/32...

http://msdn.microsoft.com/en-us/library/...

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Jak tohle vlastně řeší EF?

Tam se spojení neuzavírá, neotvírá... Co se tedy stane, když při spuštění aplikace vytvořím nový objekt databázového kontextu a používám ho jako singleton? A co se děje, když ho vytvářím mnohonásobě (s tím, že jeho odkaz ztrácím, takže by se měl někdy uklidit)

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Výchozí chování je, že EF má otevřenou connection pouze po dobu zpracovávání nějakého dotazu nebo metody SaveChanges.

Je to uvedeno například v MSDN:

http://msdn.microsoft.com/en-us/library/...

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback