<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="https://www.dotnetzone.gr:443/cs/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>.NET Framework</title><link>https://www.dotnetzone.gr:443/cs/forums/14/ShowForum.aspx</link><description>Θέματα για threading, remoting, reflection, exception handling, security, regex κλπ.</description><dc:language>el</dc:language><generator>CommunityServer 2.1 SP3 (Build: 20423.1)</generator><item><title>Re: ADO connections &amp; pooling</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/1575.aspx</link><pubDate>Tue, 05 Apr 2005 07:33:16 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:1575</guid><dc:creator>George J. Capnias</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/1575.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=14&amp;PostID=1575</wfw:commentRss><description>&lt;font face="Tahoma" size="2"&gt;Βασικά πιστεύω ότι το πρόβλημα είναι η ανασφάλεια για το τι ακριβώς συμβαίνει. Κανείς δεν είναι σίγουρος, αλλά πραγματικά το θέμα είναι απλό...&lt;br /&gt;&lt;br /&gt;Όταν κάνεις close, απελευθερώνεις τα resources&amp;nbsp;του server, της&amp;nbsp;βάσης, και επιτρέπεις το connection να επιστρέψει στο pool.&lt;br /&gt;&lt;br /&gt;Όταν κάνεις dispose απελευθερόνονται τα resources του client και μεγαλώνει η ελεύθερη μνήμη.&lt;br /&gt;&lt;br /&gt;Αν δεν κλείσεις το reader, command, &lt;strong&gt;ΔΕΝ ΚΛΕΙΝΕΙ&lt;/strong&gt; το connection, και να κάνεις close στο connection.&lt;br /&gt;&lt;br /&gt;Γενικά είναι καλό να έχεις τα reader και τα command σε autoclose connection για να απελευθερόνονται τα resources του server όσο το συντομώτερο δυνατόν. Αυτό είναι πολύ καλό (best practice) για synchronous queries.&lt;br /&gt;&lt;br /&gt;Δεν είναι για τα asynchronous queries, μιας πριν διαβάσεις το τέλος του reader μπορείς να ακυρώσεις το query και να απελευθερώσεις πιο γρήγορα τα resources του server.&lt;br /&gt;&lt;br /&gt;Αυτά, λίγα και καλά...&lt;br /&gt;&lt;br /&gt;George J.&lt;br /&gt;&lt;/font&gt;</description></item><item><title>Re: ADO connections &amp; pooling</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/1562.aspx</link><pubDate>Mon, 04 Apr 2005 22:21:08 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:1562</guid><dc:creator>KelMan</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/1562.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=14&amp;PostID=1562</wfw:commentRss><description>&lt;p&gt;&lt;font style="BACKGROUND-COLOR: #efefef"&gt;Μπορεί να πάρει εικόνα του τι συμβαίνει με χρήση του Performance Monitor.&lt;br /&gt;Εκεί υπάρχουν counters για διάφορα performance objects, από το .NET CLR Data ώς το SQLServer: Genral Statistics (αν χρησιμοποιεί SQL Server). Ειδικά αν κάνει development θα μπορεί να καταλάβει τι παίζεται και πότε θα πρέπει να κλείνει ένα connection και αν επιστρέφει στο pool, κλπ&lt;/font&gt;&lt;/p&gt;</description></item><item><title>Re: ADO connections &amp; pooling</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/1561.aspx</link><pubDate>Mon, 04 Apr 2005 20:59:10 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:1561</guid><dc:creator>cap</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/1561.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=14&amp;PostID=1561</wfw:commentRss><description>Αρα μου λες οτι ο ποιητής έχει δίκιο; Close και Dispose για τα connections είναι ισοδύναμες;&lt;br /&gt;&lt;br /&gt;Τωρα οσον αφορά στο δεύτερο, ναι οντως δεν πρέπει να γίνεται έτσι. Αν λοιπόν τις κλείνει και το ανωτερω ισχύει, μένει όντως να τον ρωτήσω μήπως έχει κανενα τέτοιο κομμάτι κώδικα...&lt;br /&gt;&lt;br /&gt;</description></item><item><title>Re: ADO connections &amp; pooling</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/1560.aspx</link><pubDate>Mon, 04 Apr 2005 20:37:54 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:1560</guid><dc:creator>Παναγιώτης Καναβός</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/1560.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=14&amp;PostID=1560</wfw:commentRss><description>Για το πρώτο: Είσαι ΑΠΟΛΥΤΩΣ σίγουρος ότι τις κλείνει? Γιατί αυτό το λάθος το παίρνεις όταν ξεχνάς να κλείσεις τα connections. Αν καλείς την Close κανονικά, δεν έχεις κανένα πρόβλημα. Δοκίμασα τον παρακάτω κώδικα:&lt;br /&gt; &lt;br /&gt; &lt;pre class="source"&gt;&lt;table border="0" cellspacing="0" width="100%"&gt;&lt;tr&gt;&lt;td width="15"&gt;&lt;/td&gt;&lt;td bgcolor="lightgrey" width="15"&gt;&lt;/td&gt;&lt;td bgcolor="lightgrey"&gt;&lt;br&gt;&lt;font face="Lucida Console, Courier" size="2"&gt;for(int i=0;i&amp;lt;500;i++)&lt;br/&gt; {&lt;br/&gt; SqlConnection con=new SqlConnection("Data Source=devel6;Initial Catalog=pubs;Integrated Security=SSPI;Connect Timeout=1;Max Pool Size=5");&lt;br/&gt; con.Open();&lt;br/&gt; Console.WriteLine("Connection {0} opened",i);&lt;br/&gt; con.Close();&lt;br/&gt; }&lt;/font&gt;&lt;br&gt;&amp;nbsp;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/pre&gt;Όπως είναι ανοίγουν και τα 500 connections χωρίς πρόβλημα. Αν όμως βγάλω το Close, το loop θα σκάσει μετά το 5ο iteration. &lt;br /&gt; Το default max pool size είναι 100. Αν δεν ορίσω Max Pool Size καταφέρνω να ανοίξω 147 connections πριν σκάσει το loop, οπότε κάποια connections προλαβαίνουν να γίνουν dispose και να κλείσουν.&lt;br /&gt; &lt;br /&gt; Όσο για το δεύτερο ερώτημα, η απάντηση είναι απλή. &lt;font color="#ff1493"&gt;&lt;b&gt;ΜΗΝ &lt;/b&gt;&lt;/font&gt;το κάνεις έτσι. Η getConnection δημιουργεί ένα temp αντικείμενο κάθε φορά που την καλείς. Αν θέλεις να έχεις πρόσβαση σε αυτό το αντικείμενο, πρέπει να το βάλεις σε κάποια μεταβλητή.&amp;nbsp; &lt;br /&gt; &amp;nbsp;&amp;nbsp; Το ίδιο πρόβλημα θα έχεις με οποιαδήποτε κλήση επιστρέφει temp αντικείμενα, όχι μόνο με τα connections. Είναι μάλιστα ένας πολύ ωραίος τρόπος να φτιάξεις resource leaks που θα τα ψάχνεις και δεν θα τα βρίσκεις.&lt;br /&gt;</description></item><item><title>ADO connections &amp; pooling</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/1558.aspx</link><pubDate>Mon, 04 Apr 2005 18:49:31 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:1558</guid><dc:creator>cap</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/1558.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=14&amp;PostID=1558</wfw:commentRss><description>Σήμερα είχα ένα τηλέφωνο από φίλο ο οποίος με ρωτούσε τι μπορεί να κάνει για ένα πρόβλημα που του παρουσιαζόταν. Συγκεκριμένα, το error message που του έβγαινε ήταν το γνωστό &lt;em&gt;"The timeout period elapsed prior to obtaining a connection from the pool.&amp;nbsp; This may have occurred because all pooled connections were in use and max pool size was reached"&lt;br /&gt;&lt;br /&gt;&lt;/em&gt;Το πρώτο πράγμα που τον ρώτησα είναι αν κάνει close τα connections που ανοίγει όταν τελειώσει τη δουλειά του. Μου είπε οτι τα κάνει.&lt;br /&gt;Το δεύτερο πράγμα που τον ρώτησα είναι τι pool size έχει. Μου είπε οτι δεν είχε ορίσει κατι στο conn string, αρα υπέθεσα οτι ήταν το default (30 νομιζω; )&lt;br /&gt;Το τρίτο πράγμα που τον ρώτησα είναι αν κάνει dispose τα connections του. Μου είπε πως οχι. &lt;br /&gt;&lt;br /&gt;Αυτό που συμπέρανα είναι οτι τα non-disposed (αλλά κλειστά) connections κρατούν δεσμευμένη μια θέση από το pool ωσπου να τρέξει ο GC. Και του πρότεινα να τα κάνει explicitly dispose (vb.net χρησιμοποιεί, δεν έχει (ακόμα) το "using"). &lt;br /&gt;&lt;br /&gt;Πιστευα οτι σκεφτόμουν σωστά ωσπου διάβασα αυτό: &lt;a target="_blank" title="http://www.15seconds.com/issue/040830.htm" href="http://www.15seconds.com/issue/040830.htm"&gt;http://www.15seconds.com/issue/040830.htm&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Εδώ ο αρθρογράφος λέει το εξής:&lt;br /&gt;&lt;em&gt;"Close and Dispose methods of Connection object are equivalent. Neither one gives you any specific advantages over the other. "&lt;br /&gt;&lt;br /&gt;&lt;/em&gt;Και ερωτώ ο άμοιρος: Ειναι έτσι; Αν είναι έτσι τότε μάλλον αλλού είναι το πρόβλημα. Οπως λεει και ο αρθρογράφος σε κάποιο άλλο σημείο:&lt;br /&gt;&lt;br /&gt; &lt;p&gt;&lt;em&gt;When returning a connection from a class method - make sure you cache it locally and call its Close method. The following code will leak a connection: &lt;/em&gt;&lt;span style="COLOR: black; FONT-FAMILY: 'Courier New'"&gt;&lt;br /&gt;&lt;br /&gt;OleDbCommand cmd &lt;/span&gt;&lt;b&gt;&lt;span style="COLOR: darkcyan; FONT-FAMILY: 'Courier New'"&gt;new &lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style="COLOR: midnightblue; FONT-FAMILY: 'Courier New'"&gt;OleDbCommand&lt;/span&gt;&lt;/b&gt;&lt;span style="COLOR: darkgreen; FONT-FAMILY: 'Courier New'"&gt;(&lt;/span&gt;&lt;span style="COLOR: black; FONT-FAMILY: 'Courier New'"&gt;myUpdateQuery&lt;/span&gt;&lt;span style="COLOR: darkgreen; FONT-FAMILY: 'Courier New'"&gt;, &lt;/span&gt;&lt;b&gt;&lt;span style="COLOR: midnightblue; FONT-FAMILY: 'Courier New'"&gt;getConnection&lt;/span&gt;&lt;/b&gt;&lt;span style="COLOR: darkgreen; FONT-FAMILY: 'Courier New'"&gt;());&lt;?XML:NAMESPACE PREFIX = O /&gt;&lt;O:P&gt;&lt;/O:P&gt;&lt;/span&gt; &lt;p class="MsoNormal" style="mso-layout-grid-align: none; mso-pagination: none"&gt;&lt;b&gt;&lt;span style="COLOR: darkcyan; FONT-FAMILY: 'Courier New'"&gt;int&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style="COLOR: red; FONT-FAMILY: 'Courier New'"&gt;&lt;/span&gt;&lt;/b&gt;&lt;span style="COLOR: black; FONT-FAMILY: 'Courier New'"&gt;res &lt;/span&gt;&lt;span style="COLOR: darkgreen; FONT-FAMILY: 'Courier New'"&gt;= &lt;/span&gt;&lt;span style="COLOR: black; FONT-FAMILY: 'Courier New'"&gt;cmd&lt;/span&gt;&lt;span style="COLOR: darkgreen; FONT-FAMILY: 'Courier New'"&gt;.&lt;/span&gt;&lt;b&gt;&lt;span style="COLOR: midnightblue; FONT-FAMILY: 'Courier New'"&gt;ExecuteNonQuery&lt;/span&gt;&lt;/b&gt;&lt;span style="COLOR: darkgreen; FONT-FAMILY: 'Courier New'"&gt;();&lt;O:P&gt;&lt;/O:P&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="mso-layout-grid-align: none"&gt;&lt;b&gt;&lt;span style="COLOR: midnightblue; FONT-FAMILY: 'Courier New'"&gt;getConnection&lt;/span&gt;&lt;/b&gt;&lt;span style="COLOR: darkgreen; FONT-FAMILY: 'Courier New'"&gt;().&lt;/span&gt;&lt;b&gt;&lt;span style="COLOR: midnightblue; FONT-FAMILY: 'Courier New'"&gt;Close&lt;/span&gt;&lt;/b&gt;&lt;span style="COLOR: darkgreen; FONT-FAMILY: 'Courier New'"&gt;(); // The connection returned from the first call to getConnection() is not being closed. Instead of closing your connection, this line creates a new one and tries to close it.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Και ξανά - ερωτώ: (2η ερώτηση): Πως κλείνεις κάτι τέτοιο; Δεν μας το λέει ο ποιητής...&lt;br /&gt;&lt;br /&gt;Απλές ερωτήσεις πιστεύω, αλλά εχω την απορία. Εγώ πάντα κάνω close-dispose.&lt;br /&gt;&lt;/p&gt;</description></item></channel></rss>