Σήμερα είχα ένα τηλέφωνο από φίλο ο οποίος με ρωτούσε τι μπορεί να κάνει για ένα πρόβλημα που του παρουσιαζόταν. Συγκεκριμένα, το 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