Καλώς ορίσατε στο dotNETZone.gr - Σύνδεση | Εγγραφή | Βοήθεια
σε

 

Αρχική σελίδα Ιστολόγια Συζητήσεις Εκθέσεις Φωτογραφιών Αρχειοθήκες

ADO connections & pooling

Îåêßíçóå áðü ôï ìÝëïò cap. Τελευταία δημοσίευση από το μέλος George J. Capnias στις 05-04-2005, 00:33. Υπάρχουν 4 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  04-04-2005, 11:49 1558

    ADO connections & pooling

    Σήμερα είχα ένα τηλέφωνο από φίλο ο οποίος με ρωτούσε τι μπορεί να κάνει για ένα πρόβλημα που του παρουσιαζόταν. Συγκεκριμένα, το error message που του έβγαινε ήταν το γνωστό "The timeout period elapsed prior to obtaining a connection from the pool.  This may have occurred because all pooled connections were in use and max pool size was reached"

    Το πρώτο πράγμα που τον ρώτησα είναι αν κάνει close τα connections που ανοίγει όταν τελειώσει τη δουλειά του. Μου είπε οτι τα κάνει.
    Το δεύτερο πράγμα που τον ρώτησα είναι τι pool size έχει. Μου είπε οτι δεν είχε ορίσει κατι στο conn string, αρα υπέθεσα οτι ήταν το default (30 νομιζω; )
    Το τρίτο πράγμα που τον ρώτησα είναι αν κάνει dispose τα connections του. Μου είπε πως οχι.

    Αυτό που συμπέρανα είναι οτι τα non-disposed (αλλά κλειστά) connections κρατούν δεσμευμένη μια θέση από το pool ωσπου να τρέξει ο GC. Και του πρότεινα να τα κάνει explicitly dispose (vb.net χρησιμοποιεί, δεν έχει (ακόμα) το "using").

    Πιστευα οτι σκεφτόμουν σωστά ωσπου διάβασα αυτό: http://www.15seconds.com/issue/040830.htm

    Εδώ ο αρθρογράφος λέει το εξής:
    "Close and Dispose methods of Connection object are equivalent. Neither one gives you any specific advantages over the other. "

    Και ερωτώ ο άμοιρος: Ειναι έτσι; Αν είναι έτσι τότε μάλλον αλλού είναι το πρόβλημα. Οπως λεει και ο αρθρογράφος σε κάποιο άλλο σημείο:

    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:

    OleDbCommand cmd
    new OleDbCommand(myUpdateQuery, getConnection());

    intres = cmd.ExecuteNonQuery();

    getConnection().Close(); // 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.

    Και ξανά - ερωτώ: (2η ερώτηση): Πως κλείνεις κάτι τέτοιο; Δεν μας το λέει ο ποιητής...

    Απλές ερωτήσεις πιστεύω, αλλά εχω την απορία. Εγώ πάντα κάνω close-dispose.


    Σωτήρης Φιλιππίδης

    DotSee Web Services

    View Sotiris Filippidis's profile on LinkedIn

    DotNetNuke them!
  •  04-04-2005, 13:37 1560 σε απάντηση της 1558

    Re: ADO connections & pooling

    Για το πρώτο: Είσαι ΑΠΟΛΥΤΩΣ σίγουρος ότι τις κλείνει? Γιατί αυτό το λάθος το παίρνεις όταν ξεχνάς να κλείσεις τα connections. Αν καλείς την Close κανονικά, δεν έχεις κανένα πρόβλημα. Δοκίμασα τον παρακάτω κώδικα:


    for(int i=0;i<500;i++)
    {
    SqlConnection con=new SqlConnection("Data Source=devel6;Initial Catalog=pubs;Integrated Security=SSPI;Connect Timeout=1;Max Pool Size=5");
    con.Open();
    Console.WriteLine("Connection {0} opened",i);
    con.Close();
    }

     
    Όπως είναι ανοίγουν και τα 500 connections χωρίς πρόβλημα. Αν όμως βγάλω το Close, το loop θα σκάσει μετά το 5ο iteration.
    Το default max pool size είναι 100. Αν δεν ορίσω Max Pool Size καταφέρνω να ανοίξω 147 connections πριν σκάσει το loop, οπότε κάποια connections προλαβαίνουν να γίνουν dispose και να κλείσουν.

    Όσο για το δεύτερο ερώτημα, η απάντηση είναι απλή. ΜΗΝ το κάνεις έτσι. Η getConnection δημιουργεί ένα temp αντικείμενο κάθε φορά που την καλείς. Αν θέλεις να έχεις πρόσβαση σε αυτό το αντικείμενο, πρέπει να το βάλεις σε κάποια μεταβλητή. 
       Το ίδιο πρόβλημα θα έχεις με οποιαδήποτε κλήση επιστρέφει temp αντικείμενα, όχι μόνο με τα connections. Είναι μάλιστα ένας πολύ ωραίος τρόπος να φτιάξεις resource leaks που θα τα ψάχνεις και δεν θα τα βρίσκεις.

    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  04-04-2005, 13:59 1561 σε απάντηση της 1560

    Re: ADO connections & pooling

    Αρα μου λες οτι ο ποιητής έχει δίκιο; Close και Dispose για τα connections είναι ισοδύναμες;

    Τωρα οσον αφορά στο δεύτερο, ναι οντως δεν πρέπει να γίνεται έτσι. Αν λοιπόν τις κλείνει και το ανωτερω ισχύει, μένει όντως να τον ρωτήσω μήπως έχει κανενα τέτοιο κομμάτι κώδικα...


    Σωτήρης Φιλιππίδης

    DotSee Web Services

    View Sotiris Filippidis's profile on LinkedIn

    DotNetNuke them!
  •  04-04-2005, 15:21 1562 σε απάντηση της 1561

    Re: ADO connections & pooling

    Μπορεί να πάρει εικόνα του τι συμβαίνει με χρήση του Performance Monitor.
    Εκεί υπάρχουν counters για διάφορα performance objects, από το .NET CLR Data ώς το SQLServer: Genral Statistics (αν χρησιμοποιεί SQL Server). Ειδικά αν κάνει development θα μπορεί να καταλάβει τι παίζεται και πότε θα πρέπει να κλείνει ένα connection και αν επιστρέφει στο pool, κλπ


    Vir prudens non contra ventum mingit
  •  05-04-2005, 00:33 1575 σε απάντηση της 1562

    Re: ADO connections & pooling

    Βασικά πιστεύω ότι το πρόβλημα είναι η ανασφάλεια για το τι ακριβώς συμβαίνει. Κανείς δεν είναι σίγουρος, αλλά πραγματικά το θέμα είναι απλό...

    Όταν κάνεις close, απελευθερώνεις τα resources του server, της βάσης, και επιτρέπεις το connection να επιστρέψει στο pool.

    Όταν κάνεις dispose απελευθερόνονται τα resources του client και μεγαλώνει η ελεύθερη μνήμη.

    Αν δεν κλείσεις το reader, command, ΔΕΝ ΚΛΕΙΝΕΙ το connection, και να κάνεις close στο connection.

    Γενικά είναι καλό να έχεις τα reader και τα command σε autoclose connection για να απελευθερόνονται τα resources του server όσο το συντομώτερο δυνατόν. Αυτό είναι πολύ καλό (best practice) για synchronous queries.

    Δεν είναι για τα asynchronous queries, μιας πριν διαβάσεις το τέλος του reader μπορείς να ακυρώσεις το query και να απελευθερώσεις πιο γρήγορα τα resources του server.

    Αυτά, λίγα και καλά...

    George J.

    George J. Capnias: Χειροπρακτικός Υπολογιστών, Ύψιστος Γκουράρχης της Κουμπουτερολογίας
    w: capnias.org, t: @gcapnias, l: gr.linkedin.com/in/gcapnias
    dotNETZone.gr News
Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems