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

 

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

Mange connections with Enterprise Library

Îåêßíçóå áðü ôï ìÝëïò StrouMfios. Τελευταία δημοσίευση από το μέλος StrouMfios στις 29-11-2010, 21:58. Υπάρχουν 8 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  26-11-2010, 17:42 61100

    Mange connections with Enterprise Library

    Καλησπέρα σε όλους,

    έχω ξεκινήσει ενα project σε c#, sqlServer και για το DAL χρησιμοποιώ enterprise library.
    Το πρόβλημα μου είναι οτι δεν ξέρω πως γίνεται η διαχείριση των connections.
    Είχα διαβάσει ενα άρθρο το οποίο έλεγε οτι τα connections ανοίγουν και κλείνουν αυτόματα.

    Έχω τους ενδοιασμούς μου και θα ήθελα να μάθω αν κάτι τέτοιο αληθεύει.
    Στην περίπτωση που δεν αληθεύει ποιός είναι ο καλύτερος τρόπος για την διαχείριση των connections?

    Αυτή είναι μια απο τις μεθόδους που χρησιμοποιώ
    public DataSet GetHotelAvailability(string hotelID, string date) {
                var sqlStr = "SELECT something";
                DbCommand cmd = db.GetSqlStringCommand(sqlStr);
    
                db.AddInParameter(cmd, "@HotelID", SqlDbType.BigInt, hotelID);
                db.AddInParameter(cmd, "@Date", SqlDbType.NVarChar, date);
    
                return db.ExecuteDataSet(cmd);
            }


    Ευχαριστώ

    αν δεν το θες, www.antallakseto.gr
  •  27-11-2010, 23:33 61117 σε απάντηση της 61100

    Απ: Mange connections with Enterprise Library


    Έχεις δίκιο στο ότι το enterpise library διαχειρίζεται τα connections για σένα. Ακολουθεί την πολύ καλή και σοφή διαδικασία του "ανοίγω αργά το connection - κλείνω νωρίς το connection".Αν εσύ γεμίζεις ένα dataset με data, το enterprise library θα διαχειριστεί αυτό το "ανοιγοκλείσιμο". Έχει ένα δικό του config αρχείο που αποθηκεύει τα connection strings. Είναι xml based (e.g web.config,app.config) και υπάρχει ειδικό εργαλείο το Enterprise Library Configuration Tool το οποίο επιτρέπει την εύκολη επεξεργασία του.

    Νικόλαος Καντζέλης
    BSc, MSc, MCAS, MCPD, MCITP, MCTS,MCP, MCT
    http://www.nksolutions.gr
    http://dotnetstories.wordpress.com
    http://weblogs.asp.net/dotnetstories
    http://forum.dotnetnuke.gr
  •  28-11-2010, 13:49 61121 σε απάντηση της 61117

    Απ: Mange connections with Enterprise Library

    Προβληματίστκα αρκετά με το enterprise library γιατί ενώ διαχειρίζεται τα connections αυτόματα και ενώ είμαι ο μοναδικός χρήστης που χρησιμοποιεί την βάση, υπήρχαν πάνω απο 15 connections ανοιχτά. 

    Σαν επιστροφή πάντα χρησιμοποιώ DataReader για λόγους performance, αλλά είδα τελικά οτι χρησιμοποιώντας DataReader και παρόλο που το κλείνω (το dataReader), το connection έμενε ανοιχτό.
    Στις ίδιες μεθόδους αντι για DataReader χρησιμοποίησα DataSet και είδα οτι τελικά το connection όντως κλείνει και ανοίγει αυτόματα και σαφώς γίνεται χρήση του pooling.

    Είναι κάποιο bug που έχει το enterprise library?

    Ευχαριστώ


    αν δεν το θες, www.antallakseto.gr
  •  28-11-2010, 23:02 61126 σε απάντηση της 61121

    Απ: Mange connections with Enterprise Library

    Με ADO.net ή enterprise library το connection, όταν καλείς την ExecuteReader() του command object, μένει ανοικτό.

    είχες τα statements σου μέσα σε "using" blocks? Γενικά τα objects σου(ο κώδικας που φαντάζομαι έχεις γράψει με το datareader) μέσα στα using statements (αν τα είχες) υλοποιούν το IDisposable interface.

    Επίσης θα μπορούσες να κάνεις το εξής:

    Dim myreader As SqlDataReader  = command.ExecuteReader(CommandBehavior.CloseConnection)



    και στο τέλος να κάνεις ένα έλεγχο και να κλείνεις πάλι το connection κάπως έτσι.

    if connection.State=Connection.Open then Connection.Close

    Δοκίμασε λοιπόν πάλι να παίξεις με το DataReader object και να αλλάξεις λίγο τον κώδικα σου.

    Νικόλαος Καντζέλης
    BSc, MSc, MCAS, MCPD, MCITP, MCTS,MCP, MCT
    http://www.nksolutions.gr
    http://dotnetstories.wordpress.com
    http://weblogs.asp.net/dotnetstories
    http://forum.dotnetnuke.gr
  •  28-11-2010, 23:09 61128 σε απάντηση της 61126

    Απ: Mange connections with Enterprise Library

    Νίκο, μάλλον τα έμπλεξες. Εφόσον χρησιμοποιείς using, τί το θέλεις το καρφωτό Close και το CommandBehavior ????


    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  28-11-2010, 23:11 61129 σε απάντηση της 61126

    Απ: Mange connections with Enterprise Library

    Προσοχή με το CommandBehavior.CloseConnection. Διαβασε εδώ: http://richarddingwall.name/2009/06/10/memory-leak-with-enterprise-library-4-data-block-and-execute-reader/

    Αντιγράφω την εξήγηση που παραθέτει ο ίδιος από το MSDN Mag του 2003(!)

    …My test application shows that even when you use this [CommandBehavior.CloseConnection] option, if you don’t explicitly close the DataReader (or SqlConnection), the pool overflows. The application then throws an exception when the code requests more connections than the pool will hold.

    Some developers insist that if you set the CommandBehavior.CloseConnection option, the DataReader and its associated connection close automatically when the DataReader finishes reading the data. Those developers are partially right—but the option works this way only when you’re using a complex bound control in an ASP.NET Web application. Looping through a DataReader result set to the end of its rowset (that is, when —the DataReader’s Read method— returns false) isn’t enough to trigger automatic connection closing. However, if you bind to a complex bound control such as the DataGrid, the control closes the DataReader and the connection— but only if you’ve set the CommandBehavior.CloseConnection option.

    If you execute a query by using another Execute method (e.g., ExecuteScalar, ExecuteNonQuery, ExecuteXMLReader), you are responsible for opening the SqlConnection object and, more importantly, closing it when the query finishes. If you miss a close, orphaned connections quickly accumulate.

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

    DotSee Web Services

    View Sotiris Filippidis's profile on LinkedIn

    DotNetNuke them!
  •  29-11-2010, 09:44 61130 σε απάντηση της 61129

    Απ: Mange connections with Enterprise Library

    Πολυ καλό το άρθρο και αρκετά ξεκάθαρο.
    Οπότε στην περίπτωση μου, πρέπει να διαχειριστώ μόνος μου το άνοιγμα και το κλείσιμο των connections.
    Αφου δεν κάνω bind σε κάποιο .net control, δεν επωφελούμε απο το CommandBehavior.CloseConnection.

    Ευχαριστώ

    αν δεν το θες, www.antallakseto.gr
  •  29-11-2010, 19:58 61154 σε απάντηση της 61130

    Απ: Mange connections with Enterprise Library

    Ναι ο σωτήρης έδωσε το σωστό Link.

    αν προσέξεις κάπου στον κώδικα έχει το εξής

    1
    2
     
     if (command.Connection.State == ConnectionState.Open)
                command.Connection.Close();

    που είναι ο ίδιος κώδικας που σου έδωσα και εγώ στο δικό μου post σε Vb

    if connection.State=Connection.Open then Connection.Close 
    Οπότε τίποτα δεν είναι bug, απλά πρέπει να είμαστε γνώστες το πως χειρίζεται τα connections το DAAB.



    Νικόλαος Καντζέλης
    BSc, MSc, MCAS, MCPD, MCITP, MCTS,MCP, MCT
    http://www.nksolutions.gr
    http://dotnetstories.wordpress.com
    http://weblogs.asp.net/dotnetstories
    http://forum.dotnetnuke.gr
  •  29-11-2010, 21:58 61174 σε απάντηση της 61154

    Απ: Mange connections with Enterprise Library

    Τώρα έχω αναθεωρήσει το γεγονός οτι μπορεί να είναι bug.
    Το δικό σου post είναι σωστό και σ'ευχαριστώ για την βοήθεια αλλά εφαρμόζεται μόνο σε περιπτώσεις που χρησιμοποιούμε .net controls (όπως λέει και το άρθρο).

    Εν το μεταξύ μου έκανε φοβερή εντύπωση το γεγονός οτι για ExecuteScalar, ExecuteNonQuery, ExecuteXMLReader πρέπει και πάλι να ελέγχω αν το connection ειναι open ωστε να το κλείσω manually.

    Το περίμενα πιο intelligent.

    αν δεν το θες, www.antallakseto.gr
Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems