Udrzovanie otvoreneho pripojenia – .NET – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Udrzovanie otvoreneho pripojenia – .NET – Fórum – Programujte.comUdrzovanie otvoreneho pripojenia – .NET – Fórum – Programujte.com

 

peter ciz
~ Anonymní uživatel
4 příspěvky
14. 12. 2012   #1
-
0
-

Ahojte.

Mam aplikaciu, v ktorej taham nejake data zo vzdialenej databazy, nieco rozparsujem a potom to ukladam do databazy. Resp, zaujima  ma, ako spravit to ukladanie do vlastne databazy. Jedna moznost je, ze v jednom kroku natiahnem data, pouzijem nejaku logiku a nasledne ich ulozim. Ta aplikacia ale teraz bezi niekolko minut a myslim, ze v buducnosti tych zaznamov bude este viac, takze po celu dobu by som mal udrzovat otvorene spojenie a to sa mi nezda ako stastne. Mohol by som ho sice po kazdom INSERTE uzavriet a pri dalsom zase otvorit, ale to mi nepride o nic stastnejsie.

Dalsia moznost je, ze najskor naplnim nejaku kolekciu a tu potom nejakou vlastnou metodou ulozim do DB. Tu by to spojenie bolo otvorene podstatne kratsie. Je to ale nejaky a mozno zbytocny kod navyse. Takze, ako by to bolo najvhodnejsie a pripadne preco ? Vdaka.

Nahlásit jako SPAM
IP: 212.89.227.–
liborb
~ Redaktor
+18
Guru
14. 12. 2012   #2
-
0
-

Nechat otevřené spojení, dokud ho budeš potřebovat, je správné řešení. Není to potřeba nijak obcházet.

Nahlásit jako SPAM
IP: 188.75.135.–
peter ciz
~ Anonymní uživatel
4 příspěvky
14. 12. 2012   #3
-
0
-

Trochu som badal a doslo mi, ze vdaka connection poolingu by nevadilo ani keby som to pripojenie otvaral/zatvaral pri kazdom INSERTe, nie ? Ked uz, takto by sa mi to pacilo viac, lebo by som cele ukladanie mohol napisat do jednej metody a kod by bol trochu prehladnejsi. 

Nahlásit jako SPAM
IP: 212.89.227.–
Vaizo0
Stálý člen
14. 12. 2012   #4
-
0
-

Connection do databáze bys měl zavřít hned, jak ho přestaneš používat, aby se connection, co nejdřív vrátilo do poolu a bylo dostupné ostatním částem aplikace nebo případně i jiným aplikacím a zároveň se uvolnili i zdroje navázané na to připojení.

Pokud používáš SqlConnection, měl bys použít using:

using (SqlConnection connection = <connection code>)
{
  using (SqlCommand command = <command code>)
  {
   // ...
  }
}

using volá Dispose a ten volá Close.

Každá databáze má navíc jen omezený počet připojení a mít neustale otevřené připojení třeba z více počítačů není nic dobrého.

Jestliže třeba v cyklu děláš insert, tak bych to považoval za jedno použití a měl jedno connection na celý cyklus. Pochopitelně také záleží, jaké jsou prodlevy mezi jednotlivými inserty.

Pokud můžeš, snaž se všechny inserty udělat v jednom příkazů a né třeba v cyklu ...

Nahlásit jako SPAM
IP: 85.93.127.–
peter ciz
~ Anonymní uživatel
4 příspěvky
14. 12. 2012   #5
-
0
-

Ano, toto je mi jasne, ale mal som problem aplikovat to na svoj problem. Mne to ukladanie bezi v nejakom foreach a odhadom sa mozno kazde 2-3 sekundy zavola nejaky INSERT. Cele to teda bezi pomerne dlho a preto som nechcel drzat otvorene jedno spojenie celych 10-20 minut. Ak by som data ulozil do kolekcie, ukladanie by prebiehalo ovela rychlejsie, pretoze by sa necakalo na parsovanie a predpokladam, ze spojenie by sa udrzovalo otvorene max 1minutu pocas ktorej by bolo neustale vyuzivane.

Z toho co si pisal som pochopil, ze tie cca 2-3 sekundy je dost dlhy cas na to aby malo zmysel spojenie po kazdom INSERTe ukoncit a spolahnut sa na connection pooling, ze to zmanazuje tak aby to nijak neubral na vykone.

Chapem to spravne ? 

Nahlásit jako SPAM
IP: 212.89.227.–
peter ciz
~ Anonymní uživatel
4 příspěvky
14. 12. 2012   #6
-
0
-

No, ulozit to v jednom prikaze by bol zrejme problem. Neviem si predstavit, ako by som to spravil ... 

Nahlásit jako SPAM
IP: 212.89.227.–
Vaizo0
Stálý člen
14. 12. 2012   #7
-
0
-

Já si myslím, že je to vždycky na individuálním posouzení.

Osobně se většinou snažím zmenšit relaci mezi aplikací a databází na minimum, takže ukládám více záznamů jedním insertem a obdobně se snažím zmenšit i počat vstupů do databáze v rámci čtení - selectu.

Má to však i nevýhody:

  • Hůř se to ladí (není jasné, který insert třeba neprošel).
  • Záznamy nejsou do databáze uloženy okamžitě, ale až se všemi ostatními. Tady záleží na charakteru aplikace, jestli to vadí nebo ne ...
  • Záznamy si před insertem ukládáš v paměti, takže ti roste paměťová náročnost aplikace. Dle mé zkušenosti ve většině případů, je ale nejchoulostivějším zdrojen právě databáze, a proto se snažíš šetřit právě jí. Kdybys měl ukládat třeba milion záznamů, tak si myslím, že ani jedno z těchto dvou krajních řešení (1 insert nebo milion insertů) by nebylo nejsprávnější a chtělo by to nějaký kompromis, třeba ukládání po stovkách.

Co se snažím říct je to, že se na tvoji otázku nedá obecně odpovědět a záleží na povaze aplikace. Ve většině případů platí to, že by connection mělo být otevřeno nejkratší možnou dobu a komunikace s ní, co nejmenší.

Nahlásit jako SPAM
IP: 85.93.127.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 29 hostů

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý