{"id":757,"date":"2009-02-12T01:45:23","date_gmt":"2009-02-12T00:45:23","guid":{"rendered":"http:\/\/soci.hu\/blog\/?p=757"},"modified":"2009-02-12T01:46:28","modified_gmt":"2009-02-12T00:46:28","slug":"net-teljesitmenyhangolasi-tapasztalatok-5","status":"publish","type":"post","link":"https:\/\/soci.hu\/blog\/index.php\/2009\/02\/12\/net-teljesitmenyhangolasi-tapasztalatok-5\/","title":{"rendered":".NET teljes\u00edtm\u00e9nyhangol\u00e1si tapasztalatok 5."},"content":{"rendered":"<p>Szeretj\u00fck a connection poolt, de nem mindig.<\/p>\n<p>Tudjuk, hogy manaps\u00e1g nem illik sok\u00e1ig nyitva tartani az adatb\u00e1zis kapcsolatot, hanem bemegy\u00fcnk, kihozzuk a sz\u00fcks\u00e9ges adatokat, majd lez\u00e1rjuk a kapcsolatot. R\u00e9gen (n > 10 \u00e9v) ez nem volt okos dolog, mert lass\u00fa volt a bel\u00e9p\u00e9s-kil\u00e9p\u00e9s. Ez\u00e9rt tal\u00e1lt\u00e1k ki a Connection Poolt, amit OLEDB-ben m\u00e9g Session Poolnak h\u00edvtak. Egykutya.<br \/>\nEz arr\u00f3l sz\u00f3l, hogy a kliens oldali adatel\u00e9r\u0151 komponens, pl. az ADO.NET SqlClient providere (System.Data.SqlClient n\u00e9vt\u00e9r \u00e9s k\u00f6lkei) \u00fajrahasznos\u00edtja a lez\u00e1rt kapcsolatot. Azaz mi SqlConnection.Close-t mondunk, \u0151 viszont a h\u00e1tt\u00e9rben nem z\u00e1rja le a kapcsolatot az adatb\u00e1zis fel\u00e9. Ha ezek ut\u00e1n \u00fajra meg akarjuk nyitni egy kapcsolatot az adatb\u00e1zis fel\u00e9, nem hoz l\u00e9tre \u00faj kapcsolatot a provider, hanem visszaad egy haszn\u00e1ltat a poolb\u00f3l. Mi\u00e9rt j\u00f3 ez? Nyilv\u00e1n egy t\u00e9nyleges kapcsolat ki\u00e9p\u00edt\u00e9se igen k\u00f6lts\u00e9ges, TCP csatorna vagy Named Pipe session fel\u00e9p\u00edt\u00e9se, autentik\u00e1ci\u00f3, ecetera. Ezt nagyon sokszor meg\u00fasszuk, h\u00e1la a poolnak. A pool 4-8 perc k\u00f6z\u00f6tti v\u00e9letlenszer\u0171 id\u0151k\u00f6z\u00f6nk\u00e9nt az\u00e9rt lez\u00e1rogatja a haszn\u00e1lt kapcsolatokat, ott ne z\u00e1puljanak.<br \/>\nNyilv\u00e1nval\u00f3, hogy felhaszn\u00e1l\u00f3nk\u00e9nt egyedi poolok vannak, \u00edgy egy sysadmin \u00e1ltal eldobott kapcsolatot nem adja oda nekem, l\u00f3picinek a provider, ez cs\u00fanya luk lenne.<br \/>\nLehet az\u00e9rt \u00edgy is aljaskodni az \u00faj b\u00e9rl\u0151kkel. Mi van, ha becsatlakozok, kiadok egy use m\u00e1sik adatb\u00e1zist, majd r\u00f6h\u00f6gve lez\u00e1rom a kapcsolatot? \u00c9s ha egy-ket set opci\u00f3t \u00e1t\u00edrok, pl. SET LANGUAGE urdi? Mit l\u00e1t a k\u00f6vetkez\u0151 h\u00edv\u00f3, aki megkapja a haszn\u00e1lt kapcsolatot? H\u00e1t amit be\u00e1ll\u00edtottunk az el\u0151z\u0151 l\u00e9p\u00e9sben. Az\u00e9rt ez durv\u00e1n hangzik, ugye? Szerencs\u00e9re a helyzet az, hogy alapban tiszta k\u00f6rnyezetet kapunk, k\u00f6sz\u00f6nhet\u0151en annak, hogy a provider pool manager-e v\u00e9grehajt egy sp_reset_connection h\u00edv\u00e1st miel\u0151tt visszaadn\u00e1 nek\u00fcnk a haszn\u00e1lt kapcsolatot. Hogy ez pontosan mit csin\u00e1l, azt <a href=\"\/blog\/index.php\/2007\/12\/04\/mit-csinal-az-sp_resetconnection\/\">egyszer m\u00e1r le\u00edrtam<\/a>, tess\u00e9k megn\u00e9zni a list\u00e1t.<br \/>\nAzaz b\u00e1r nem kell minden egyes k\u00e9r\u00e9shez \u00faj kapcsolatot megnyitni, az\u00e9rt egy sp h\u00edv\u00e1s csak t\u00f6rt\u00e9nik pluszban a h\u00e1tt\u00e9rben. SQL Profilerben l\u00e1tszik, hogy ez nagyon gyors, de az\u00e9rt ez m\u00e9gis csak egy h\u00e1l\u00f3zati k\u00f6r\u00fclfordul\u00e1s.<br \/>\n\u00c9s most j\u00f6n a tr\u00fckk. Ha teljesen biztosak vagyunk benne, hogy nem tolunk ki a k\u00f6vetkez\u0151 h\u00edv\u00f3val aki megkapja a haszn\u00e1lt kapcsolatunkat, akkor kikapcsolhatjuk a takar\u00edt\u00e1st. A <a href=\"http:\/\/msdn.microsoft.com\/en-us\/library\/system.data.sqlclient.sqlconnection.connectionstring(VS.80).aspx\">connection stringbe<\/a> ezt kell be\u00edrni:<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\nConnection Reset=false;\r\n<\/pre>\n<p>N\u00e9zz\u00fck meg az al\u00e1bbi k\u00f3dot:<\/p>\n<p>SqlConnection conn = new SqlConnection(&#8220;data source=.;initial catalog=ATS;Integrated security=true;&#8221;);<br \/>\nSqlCommand cmd = new SqlCommand(&#8220;sp_who&#8221;, conn);<br \/>\ncmd.CommandType = CommandType.StoredProcedure;<\/p>\n<p>for (int i = 0; i < 3; i++)\n{\n    conn.Open();\n    cmd.ExecuteNonQuery();\n    conn.Close();\n}\n[\/source]\n\nAz SQL Profilerben ez l\u00e1tszik:\n\n[source='C']\nEventClass\tTextData\tSPID\nAudit Login\t-- network protocol: LPC\t\nRPC:Completed\texec sp_who \t52\nAudit Logout\t\t52\nRPC:Completed\texec sp_reset_connection \t52\nAudit Login\t-- network protocol: LPC\t\nRPC:Completed\texec sp_who \t52\nAudit Logout\t\t52\nRPC:Completed\texec sp_reset_connection \t52\nAudit Login\t-- network protocol: LPC\t\nRPC:Completed\texec sp_who \t52\nAudit Logout\t\t52\n[\/source]\n\nHopp\u00e1, ez nem az, amit v\u00e1rtunk! Csak 1 logint az elej\u00e9n \u00e9s 1 logoutot a v\u00e9g\u00e9n, k\u00f6zben meg az sp_resetconnectiont \u00e9s az sp_who-nkat. Nem m\u0171k\u00f6dik a pooling?\nDe. Csib\u00e9sz a profiler.\n\"The Audit Login event class indicates that a user has successfully logged in to Microsoft SQL Server. Events in this class are fired by new connections or by connections that are reused from a connection pool.\"\n\nHa bekapcsoljuk a profilerben az Event Subclasst, kicsit tisztul a k\u00e9p:\n\n[source='C']\nEventClass\tTextData\tSPID\tEventSubClass\nAudit Login\t-- network protocol: LPC\t\t1 - Nonpooled\nRPC:Completed\texec sp_who \t52\t\nAudit Logout\t\t52\t2 - Pooled\nRPC:Completed\texec sp_reset_connection \t52\t\nAudit Login\t-- network protocol: LPC\t\t2 - Pooled\nRPC:Completed\texec sp_who \t52\t\nAudit Logout\t\t52\t2 - Pooled\nRPC:Completed\texec sp_reset_connection \t52\t\nAudit Login\t-- network protocol: LPC\t\t2 - Pooled\nRPC:Completed\texec sp_who \t52\t\nAudit Logout\t\t52\t1 - Nonpooled\n[\/source]\n\nSz\u00f3val van pooling, csak a profiler ravaszkodik. M\u00e1r kivert a v\u00edz. Viszont valami ebben zavar. A pooling ugye a kliensen van. Honnan tudja a szerver egy \u00faj parancs be\u00e9rkeztekor az egy \u00faj parancsnak sz\u00e1m\u00edt a kliens r\u00e9sz\u00e9r\u0151l a m\u00e9g nyitott kapcsolaton, vagy csak a poolb\u00f3l visszakapott kapcsolaton hajtanak v\u00e9gre egy \u00faj parancsot?\nSzerintem \u0151 mesters\u00e9gesen szintetiz\u00e1lja a poolos login-logoutokat, az sp_reset_connection-\u00f6k be\u00e9rkeztekor veszi \u0151ket k\u00f6rbe login-logout p\u00e1rossal, a feeling kedv\u00e9\u00e9rt. De ez csak tipp.\n\nKapcsoljuk ki a connection resetet:\n\n[source='C#']\nSqlConnection conn = new SqlConnection(\n    \"data source=.;initial catalog=ATS;Integrated security=true;connection reset=false;\");\n[\/source]\n\nMit l\u00e1tunk a profilerben? Semmi nem v\u00e1ltozott! .NET fw. 2.0 felett nem lehet kikapcsolni az sp_reset_connection-t! Ez\u00e9rt nincs m\u00e1r a <a href=\"http:\/\/msdn.microsoft.com\/en-us\/library\/system.data.sqlclient.sqlconnection.connectionstring(VS.80).aspx\">leg\u00fajabb doksiban<\/a> benne ez a be\u00e1ll\u00edt\u00e1s.<\/p>\n<p>Foly. k\u00f6v.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Szeretj\u00fck a connection poolt, de nem mindig. Tudjuk, hogy manaps\u00e1g nem illik sok\u00e1ig nyitva tartani az adatb\u00e1zis kapcsolatot, hanem bemegy\u00fcnk, kihozzuk a&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[8,25,11,6,70,4,30,21,58],"tags":[],"class_list":["post-757","post","type-post","status-publish","format-standard","hentry","category-net","category-adonet","category-clr","category-adatbazisok","category-optimalizalas","category-szakmai-elet","category-sql-server","category-sql-server-2005","category-sql-server-2008"],"_links":{"self":[{"href":"https:\/\/soci.hu\/blog\/index.php\/wp-json\/wp\/v2\/posts\/757","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/soci.hu\/blog\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/soci.hu\/blog\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/soci.hu\/blog\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/soci.hu\/blog\/index.php\/wp-json\/wp\/v2\/comments?post=757"}],"version-history":[{"count":7,"href":"https:\/\/soci.hu\/blog\/index.php\/wp-json\/wp\/v2\/posts\/757\/revisions"}],"predecessor-version":[{"id":774,"href":"https:\/\/soci.hu\/blog\/index.php\/wp-json\/wp\/v2\/posts\/757\/revisions\/774"}],"wp:attachment":[{"href":"https:\/\/soci.hu\/blog\/index.php\/wp-json\/wp\/v2\/media?parent=757"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/soci.hu\/blog\/index.php\/wp-json\/wp\/v2\/categories?post=757"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/soci.hu\/blog\/index.php\/wp-json\/wp\/v2\/tags?post=757"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}