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

 

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

Θέμα με το caching στην ASP 2

Îåêßíçóå áðü ôï ìÝëïò Themis. Τελευταία δημοσίευση από το μέλος Themis στις 01-04-2005, 18:14. Υπάρχουν 4 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  01-04-2005, 09:32 1516

    Θέμα με το caching στην ASP 2

    Γεια χαρά σε όλους και καλό μήνα.

    Έχω ένα SqlDataSource (dsrc στο εξής), στο οποίο έχω enabled το caching. Το dsrc αυτό έχει Cache Dependency τον πίνακα Addresses. Έχω λοιπόν ένα WebUserControl το οποίο κάνει INSERT στον πίνακα αυτό. To INSERT το πραγματοποιώ με ένα SqlDataAdapter, του οποίου του ορίζω το SqlCommand που έχω και κάνω fill σε ένα DataSet. Μέχρι εδώ απλό και συνηθισμένο σενάριο.


    Dim da As New SqlDataAdapter(το INSERT Command μου)
    Dim ds As New DataSet
    da.Fill(ds)
    Me.dsrc.DataBind()


    Τώρα, το θέμα είναι ότι ενώ κάνω Databind στο dsrc, στη σελίδα που φορτώνει δε φαίνονται οι αλλαγές, λόγω του ότι το dsrc δεν έχει ακόμα δει ότι έγιναν αλλαγές στον πίνακα, οπότε δείχνει τα cached data. Μάλιστα, επιβεβαίωσα ότι έφταιγε το caching, βάζοντας ένα thread.sleep() για λίγο παραπάνω απ΄ όσο έχω βάλει να γίνεται ο έλεγχος για τις αλλαγές στη βάση. Στην περίπτωση αυτή, έφερε τελικά το νέο record, αλλά φυσικά δεν είναι λύση αυτή.

    Επίσης, δοκίμασα να βγάλω προσωρινά το caching από το dsrc (στο runtime), να κάνω το INSERT, να κάνω Databind και μετά να ενεργοποιήσω πάλι το caching, χωρίς όμως αποτέλεσμα (και ακόμα δεν ξέρω το γιατί, αφού λογικά με το caching disabled, θα έπρεπε το dsrc να στείλει κανονικά το SELECT query στη βάση, σωστά; )

    Ξέρω πως προφανώς μια λύση είναι να βάλω το INSERT command μου στο InsertQuery του dsrc και να χρησιμοποιήσω το dsrc.Insert() method, αλλά έχω άλλους λόγους που δε θέλω να το κάνω αυτό, αλλιώς θα το είχα κάνει ήδη.

    Επειδή είναι και η πρώτη φορά που γράφω, να σας πω ότι είμαι rookie γενικά στον προγραμματισμό, οπότε σας παρακαλώ με το μαλακό Angel

  •  01-04-2005, 12:04 1521 σε απάντηση της 1516

    Re: Θέμα με το caching στην ASP 2

    Έχεις τρέξει το aspnet_reqsql για να ενεργοποιήσεις το cache invalidation στον SQL Server? Αν δεν το τρέξεις αυτό, το SqlDataSource δεν καταλαβαίνει τις αλλαγές. Το aspnet_reqsql δημιουργεί ένα κεντρικό πίνακα που περιέχει τις τελευταίες αλλαγές που έγιναν στη βάση, και δημιουργεί triggers στους πίνακες που θέλεις να παρακολουθήσεις για να ενημερώνει αυτό τον κεντρικό πίνακα.
      Οπότε για να δουλέψει το cache invalidation πρέπει να τρέξεις το aspnet_reqsql και να του περάσεις τους πίνακες που θέλεις να παρακολουθείς. Διαφορετικά το SqlDataSource δεν έχει κάποιο τρόπο να καταλάβει τις αλλαγές.
     Δες και το http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnvs05/html/cachingnt2.asp

    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  01-04-2005, 15:20 1524 σε απάντηση της 1521

    Re: Θέμα με το caching στην ASP 2

    Ναι, το έχω ενεργοποιήσει και γενικώς παίζει κανονικά χωρίς πρόβλημα. Απλά στη συγκεκριμένη περίπτωση, δε χρησιμοποίησα το DataSource για να κάνω INSERT, αλλά πήγα με πλάγιο τρόπο. Και επειδή το PollTime το έχω βάλει 1000msec, το DataSource δεν προλαβαίνει να δει ότι κάτι έχει αλλάξει στον πίνακα μέχρι να φορτώσει η σελίδα. Γι' αυτό είπα ότι με το thread.sleep() το θέμα λυνόταν.

    Δηλαδή αν έπρεπε κάπως να συγκεκριμενοποιήσω την ερώτησή μου, αυτή θα ήταν "πώς μπορούμε να ενημερώσουμε ένα DataSource ότι άλλαξε ο πίνακάς του χωρίς να χρησιμοποιήσουμε το ίδιο το DataSource για την ενημέρωση του πίνακα".

  •  01-04-2005, 17:18 1532 σε απάντηση της 1524

    Re: Θέμα με το caching στην ASP 2

    Περιμένωντας το Yukon, που δεν χρειάζεται pollingWink
      Το cache invalidation δεν είναι χαρακτηριστικό του DataSet ή του ADO.NET, αλλά μια λειτουργία που υλοποιεί το SqlDataSource πάνω από τις βασικές κλάσεις. Αυτό που κάνει είναι να γράφει τα αποτελέσματα στο cache χρησιμοποιώντας ένα κλειδί που φτιάχνει κάνοντας hash στο συνδισμό command, connection, παραμέτρων και τιμών. Περιοδικά ελέγχει τη βάση να δει τι άλλαξε και να κάνει invalidate τα σχετικά items.
      Όταν κάνεις INSERT μέσω του datasource, αυτό κοιτάζει ποιά items πρέπει να γίνουν invalid και τα βγάζει από το cache.
     
      Ο άλλος τρόπος να κάνεις invalidate τα δεδομένα είναι να δεις πως υπολογίζει το cache key το DataSource και να αφαιρέσεις τα δεδομένα με ένα Remove(key). Δυστυχώς αυτό δεν είναι απλή δουλειά και ακόμα δεν έχω βρει πως γίνεται.

    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  01-04-2005, 18:14 1534 σε απάντηση της 1516

    Re: Θέμα με το caching στην ASP 2

    Πάντως, για την ιστορία, ενώ προσπάθησα να τρέξω την procedure AspNet_SqlCacheQueryRegisteredTablesStoredProcedure για να μαρκάρει ότι άλλαξε το table, δεν έπαιξε. Τελικά χρησιμοποίησα το INSERT του DataSource και φυσικά έπαιξε, αλλά η απορία μου έμεινε... Indifferent

    Σε πολύ ευχαριστώ για τις πληροφορίες.

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