Tento web používá soubory cookie. Dalším používáním webu s tímto souhlasíte.
jméno
heslo
přihlásit
zaregistrujte se
zapomněli jste heslo?
Programovani v C#, F# a dalsich jazycich pro .NET, Mono a ostatni CLI implementace
TENCOKACISTROMY
Máte k tomu co říct? Vložte se do diskuze.
MORMEGIL --- 17:37:03 26.9.2014
TROGLODYT: Tak tohle pochopitelně nemůže fungovat, ale spíš se divím, že to funguje „až tak dobře“. Ty začneš provádět asynchronně SQL dotaz, kterému pod nohama okamžitě zavřeš spojení na DB. To using vyhoď a zavření toho dotazu a spojení přesuň do dokončení té operace, spolu s voláním EndExecuteNonQuery (hmmm… teď namátkou nenacházím nic přehledného, ale třeba něco jako tohle).

Anebo, jak říkám, vyhoď si to do tasku bokem, třeba zhruba takhle nějak by to mohlo jít.
TROGLODYT --- 16:12:32 26.9.2014
MORMEGIL: Jedna se o CTI reseni(rizeni telefonie). Mam serverovy proces, ktery se chova jako telephony proxy (resi requesty klientu k nemu pripojenych a zaroven drzi pro kazdeho klienta jeho session s telephony serverem a klientum posila udalosti rizeni telefonie). Potud vse ok. Zaroven potrebuju sypat "log" o tom co se deje na serveru do DB. (neni to logovani behu serveru, delam zaznamy o aktivitach na jednotlivych pripojenych klientech pro pozdejsi statistiky.)
SqlConnection otviram (a pak zase zaviram) pri kazdem klientskem requestu, a nebo pri prichodu udalosti z druhe strany. [teda takhle jsem to chtel prepsat, puvodne jsem si vystacil s jednou persistentni koneksnou pro cely server]
Jak to vyresit nejakou zmenou designu si uz vymyslim, mnoznosti je nekolik,

Slo mi o rychle pouziti BeginExecuteNonQuery (namisto ExecuteNonQuery)....
EndExecuteNonQuery nevolam, protoze me vysledek toho zapisu do DB zajima pouze marginalne (maximalne bych nekam do logu zapsal ze neprobehlo)

Vse funguje jen do momentu, kdy bych tu asynchronicitu zapisu opravdu potreboval (kdyz prijdou 2 udalosti rychle za sebou, a bezi 2 paralelni zapisy do DB, tak to dava vyse zminenou chybu

v postate ten blok volani vypada takto (jeden konkretni handler)
private void Call_Established(object sender, _DGTSApiEvents_GTSA_TS_EstablishedEvent e)
{
// blabla
//.... udelej svou praci, odesli info o udalosti 'Call Established' do fronty klientske aplikaci
//
using (SqlConnection DB = new SqlConnection(DBstring)) {
DB.Open();
SqlCommand sqlCommand = new SqlCommand("INSERT zaznam o udalosti", DB);
sqlCommand.BeginExecuteNonQuery();
sqlCommand.Dispose();
DB.Close();
}
}

U toho event handleru by mi pouziti synchronniho zapisu ani nevadilo, protoze to muze byt to posledni vec co dany handler udela, ale zaznamenavam stejnym zpusobem info o klientskych requestech, a tam potrebuji (vcas) vratit response
MORMEGIL --- 11:03:17 26.9.2014
TROGLODYT: Já si teda asi moc nedokážu představit, jak to přesně máš udělaný. Kde tu SqlConnection zavíráš? Voláš EndExecuteNonQuery? Nebylo by případně možná i jednodušší místo asynchronního volání používat normální ExecuteNonQuery, ale celé to volání (včetně vytvoření nové SqlConnection atd.) odložit do threadpoolu?
TROGLODYT --- 23:28:18 25.9.2014
SAJAGI: Jasny, napsat nejakou frontu (buffer) kterej to bude do DB sypat je asi nejjednodussi dalsi reseni.
Me spis prekvapilo, ze nejde (me se nedari) pouzit primo samotnou .NETovskou sql tridu pro tu asynchronizaci (kdyz podle dokumentace se zda ze by to fungovat melo), hledal jsem zda neco nedelam blbe pri pouziti toho asynchronniho volani ExecuteNonQuery
SAJAGI --- 23:08:45 25.9.2014
TROGLODYT: Můžeš použít frontu na ukládání těch dat, pokud nehrozí, že přeteče, nebo to nejsou kritická data. Ta fronta může být ve stejném procesu (a jiné vlákno bude ukládat po dávkách do db), v jiném procesu (předávání přes WCF, nebo něco efektivnějšího), nebo přes event tracing. Těch možností je spousta. Pokud ti jde o rychlost odezvy, tak jde především o to dostat DB z kritické cesty. Každopádně bych nedoporučoval nějak masivně paralelizovat připojení do DB, neboť ti to ve výsledku nejspíš zatíží ten systém ještě víc.
TROGLODYT --- 17:00:46 25.9.2014
Mozna hloupy dotaz, ale marne se snazim googlit spravnou odpoved.

Mam serverovou aplikaci, ktera v ramci svyho behu zapisuje udalosti do DB. (neni to primo log toho serveru, spis nektery deje na serveru me zajimaji v ramci dalsich reportu co se delo.

Problem ktery resim je prilis dlouha odezva inzertu do DB (proc jsou na tabulkou do ktere zapisuju nyni poveseny triggery, a proc jsou tak slozity ze me brzdi v behu nyni ponechme stranou)

Resenim by se zdalo pouzit misto ExecuteNonQuery volat BeginExecuteNonQuery, a veskere zapisovani do DB mit asynchronni (ostatne vysledek toho insertu me vlastne nezajima, dulezity je pro me beh serveru jako takoveho, ta data v DB jsou jen tresnicka na dortu ..... ale podstatna)
Zde ale narazim na to, ze framework me necha zavolat pouze jednu asynchronni operaci najednou (pokud zavolam dalsi, dostanu exception System.InvalidOperationException: The command execution cannot proceed due to a pending asynchronous operation already in progress.
Zkusil jsem otvirat novou SqlConnection pro kazdou operaci, (protoze MSDN tvrdi, ze toto omezeni plati pro jednu SqlConnection) ale dostavam stale stejnou chybu
Zkousel jsem hledat nejake info o connection poolingu, ale dokumentace k .NETu je tak ridka az to boli..... (kazdopadne at uz skusim v connection stringu pooling True nebo false, chovani je stale stejne.)
...ale z te chyby soudim, ze v nejake forme tam ten pooling jede, a ja pri SqlConnection xx = new SqlConnection dostanu tu uz starou na ktere jeste visi ten predchozi insert

Muzete me nekdo nakopnout?
NECROMAN --- 15:29:01 27.8.2014
Co byste rádi viděli za přednášky na letošním ročníku msfest ?
Hlasujte http://www.ms-fest.cz/navrhy-temat
??? --- 18:01:39 13.8.2014
???: jo to sem pochopil ze to chces konkretne, ale to zas tu nemuzu zverejnovat... kdyztak posta, kdyby te to zajimalo

to druhy me taky napadlo, ale to bych musel vystrachat neco jinyho nez nas kod, protoze to co tu mame my, je na dlouho, je to dost prokombinovany a na to by hodina nestacila ani omylem a neda se z toho nejspis vykuchnout nic uzavrenyho...

??? --- 17:51:52 13.8.2014
???: mě spíš zajímalo něco konkrétně, já jsem u nás při výběrovém řízení programoval aplikaci, co se dotáže na uživatelem zadané NTP servery, přečte z nich časy, porovná to s aktuálním časem v PC a vypíše ;)


Jinak mě napadá ukázat mu zdrojáky nějaké hotové aplikace, dát mu třeba hodinu, aby se v tom prohrabal, a pak aby vysvětlil, jak si myslí, že to celý funguje ;)
??? --- 17:16:55 13.8.2014
chci proste strucne popsat nejaky problem a zeptat se jak by postupoval pri reseni, ale nenapada me nic moc zatim.