Προγραμματισμός

Έργα Java ανοιχτού κώδικα: Java Caching System

Ο ειδικός του Enterprise Java, Steve Haines, συμμετέχει στη σειρά έργων Open Source Java αυτόν τον μήνα με μια εισαγωγή στο Java Caching System (JCS), μια ισχυρή λύση προσωρινής αποθήκευσης σε επίπεδο επιχείρησης. Ο Steve ξεκινά με μια γρήγορη εισαγωγή στην προσωρινή αποθήκευση, συζητώντας τα κριτήρια για να προσδιορίσει εάν τα αντικείμενα πρέπει να αποθηκευτούν στην κρυφή μνήμη και αν η εφαρμογή σας θα επωφεληθεί από μια προσωρινή μνήμη. Στη συνέχεια, σας δείχνει πώς να ρυθμίσετε το JCS και να το χρησιμοποιήσετε για να δημιουργήσετε μια εφαρμογή προσωρινής αποθήκευσης.

Το Java Caching System (JCS) είναι ένα ισχυρό προϊόν προσωρινής αποθήκευσης ανοιχτού κώδικα που κυκλοφόρησε μέσω του υποπρογράμματος Apache Jakarta. Παρέχει τις τυπικές δυνατότητες που θα περιμένατε από ένα σύστημα προσωρινής μνήμης, όπως προσωρινή αποθήκευση στη μνήμη και αλγόριθμους για την επιλεκτική αφαίρεση αντικειμένων από την προσωρινή μνήμη. Προσφέρει επίσης πιο προηγμένες δυνατότητες, όπως ευρετηρίαση δίσκου cache και υποστήριξη για κατανεμημένες προσωρινές μνήμες.

Η προσωρινή μνήμη JCS έχει δομή τύπου χάρτη στην οποία τα δεδομένα αποθηκεύονται στην προσωρινή μνήμη ως ζεύγος ονόματος και τιμής. Το JCS χωρίζει την προσωρινή μνήμη περιφέρειες. Κάθε περιοχή έχει τη δική της διαμόρφωση καθώς και το δικό της σύνολο ζευγών ονομάτων-τιμών. Κάθε περιοχή μπορεί:

  • Να έχετε διαφορετικό μέγεθος
  • Να εφαρμοστεί διαφορετικά
  • Περιέχουν διαφορετικά δεδομένα

ο κλειδιά (τα ονόματα στα ζεύγη ονόματος και τιμής) σε μια περιοχή μπορεί να είναι ίδια με τα κλειδιά σε άλλες περιοχές. Αυτό είναι σημαντικό επειδή σας επιτρέπει να διατηρείτε ξεχωριστές κρυφές μνήμες για διαφορετικά αντικείμενα όλα μέσα στο ίδιο JVM - και όλα αυτά ορίζονται σε ένα μεμονωμένο αρχείο ιδιοτήτων.

Άδειες ανοιχτού κώδικα

Καθένα από τα έργα ανοιχτού κώδικα Java που καλύπτεται σε αυτήν τη σειρά υπόκειται σε άδεια, την οποία πρέπει να κατανοήσετε προτού ενσωματώσετε το έργο στα δικά σας έργα. Το JCS υπόκειται στην Άδεια Apache. ανατρέξτε στην ενότητα Πόροι για να μάθετε περισσότερα.

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

Ξεκινήστε με το JCS

Μπορείτε να κατεβάσετε το JCS από τη σελίδα λήψεων του ιστότοπου του έργου JCS. Από αυτήν τη συγγραφή, η τελευταία έκδοση είναι 1.3. Πραγματοποιήστε λήψη της δυαδικής διανομής (είτε ως αρχείο TAR σε συστήματα Unix είτε ως αρχείο ZIP στα Windows) και αποσυμπιέστε τον σε έναν τοπικό κατάλογο στον υπολογιστή σας.

Η ρίζα του καταλόγου εγκατάστασης περιέχει jcs-1.3.jar, το οποίο πρέπει να προσθέσετε στο δικό σας CLASSPATH πριν από τη σύνταξη και την εκτέλεση εφαρμογών JCS.

Κατηγορία: χρυσωρυχείο

Σε όλο αυτό το άρθρο, καθώς και στις δικές σας ανεξάρτητες μελέτες, θα διαπιστώσετε ότι το JCS έγγραφα Ο κατάλογος είναι ένας ανεκτίμητος πόρος για πληροφορίες σχετικά με το JCS, συμπεριλαμβανομένης της τεκμηρίωσης API. Το ισχυρό έγγραφο Javadoc είναι η εξουσία σας για την κατανόηση του τρόπου χρήσης των τάξεων JCS.

Θα χρειαστείτε δύο εξαρτήσεις:

  • Καταγραφή Commons
  • Ταυτόχρονος

Από το Commons Logging, προσθέστε commons-logging.jar στο δικό σου CLASSPATH.

Ένα αστάρι γρήγορης αποθήκευσης

Μια προσωρινή μνήμη έχει σχεδιαστεί για να κρατά αντικείμενα, συνήθως στη μνήμη, για άμεση πρόσβαση από μια εφαρμογή. Μια εφαρμογή αλληλεπιδρά διαφορετικά με μια προσωρινή μνήμη από τον τρόπο που αλληλεπιδρά με εξωτερικές λύσεις αποθήκευσης. Συνήθως, μια εφαρμογή αποκτά μια σύνδεση σε μια βάση δεδομένων, εκτελεί ένα ερώτημα σε ένα δίκτυο και αναλύει τα αποτελέσματα καθώς επιστρέφονται. Η προσωρινή μνήμη διατηρεί μια συλλογή από άμεσα διαθέσιμα αντικείμενα σε μια στιβαρή δομή τύπου χάρτη που δεν απαιτεί κλήση δικτύου. Η απόδοση της εφαρμογής Java Enterprise βελτιώνεται εκθετικά όταν έχει πρόσβαση σε επαναχρησιμοποιήσιμα αντικείμενα σε κρυφή μνήμη μετά τη φόρτωσή τους από μια βάση δεδομένων, αντί να πραγματοποιεί απομακρυσμένες κλήσεις βάσης δεδομένων.

Εάν η εφαρμογή σας διαθέτει έναν διαχειρίσιμο αριθμό αντικειμένων που έχουν συχνά πρόσβαση, τότε μια προσωρινή μνήμη μπορεί πιθανώς να βελτιώσει την απόδοσή της. Οι εφαρμογές Java περιορίζονται από τους διαθέσιμους πόρους στο JVM, ο πιο πολύτιμος εκ των οποίων είναι η μνήμη. Δεν έχει νόημα να αφαιρέσετε τη μνήμη από ένα JVM για να κρατήσετε αντικείμενα που σπάνια έχουν πρόσβαση. Είναι πιθανώς καλύτερο να φορτώσετε ένα αντικείμενο στο οποίο έχετε πρόσβαση μία φορά κάθε λίγες ώρες, καθώς χρειάζεται και να αφήσετε αρκετή ελεύθερη μνήμη για άλλους πόρους. Από την άλλη πλευρά, είναι καλύτερο να φορτώσετε αντικείμενα στα οποία έχετε πρόσβαση αρκετές φορές το λεπτό - ή ακόμα και αρκετές φορές την ώρα - σε μια κρυφή μνήμη και να τα σερβίρετε από τη μνήμη, αντί να κάνετε απομακρυσμένη κλήση κάθε φορά που το αντικείμενο χρειάζεται. Εάν ο αριθμός των αντικειμένων στις οποίες έχει πρόσβαση η εφαρμογή σας είναι διαχειρίσιμος στη διαθέσιμη μνήμη, τότε είναι καλός υποψήφιος για προσωρινή αποθήκευση. Αλλά αν έχει πρόσβαση εκατομμύρια των αντικειμένων συχνά, τότε ίσως εξακολουθεί να είναι προς το συμφέρον μιας εφαρμογής να φορτώσετε αντικείμενα όπως απαιτείται αντί να χρησιμοποιήσετε το 75 τοις εκατό του σωρού JVM για να φιλοξενήσετε την προσωρινή μνήμη.

Προσωρινή αποθήκευση έναντι συγκέντρωσης

Συγχύσεις σχετικά με τη διάκριση μεταξύ μιας προσωρινής μνήμης και μιας ομάδας συχνά προκύπτει σε συζητήσεις σχετικά με την προσωρινή αποθήκευση. Ποια αντικείμενα πρέπει να αποθηκευτούν στην κρυφή μνήμη και ποια αντικείμενα πρέπει να συγκεντρωθούν; Η απάντηση έγκειται στη φύση των ίδιων των αντικειμένων. Εάν ένα αντικείμενο διατηρεί κατάσταση, θα πρέπει να αποθηκευτεί στην κρυφή μνήμη. Τα απάτριδα αντικείμενα πρέπει να συγκεντρωθούν. Ως αναλογία, εξετάστε δύο δραστηριότητες: αγορά φαγητού σε ένα σούπερ μάρκετ και παραλαβή ενός παιδιού από το σχολείο. Κάθε ταμίας μπορεί να ελέγξει οποιονδήποτε πελάτη στο σούπερ μάρκετ. δεν έχει σημασία ποιος ταμίας παίρνετε, έτσι οι ταμίες πρέπει να συγκεντρωθούν. Όταν παίρνετε το παιδί σας από το σχολείο, θέλετε τα δικα σου παιδί, όχι κάποιος άλλος, οπότε τα παιδιά πρέπει να αποθηκεύονται στην κρυφή μνήμη.

Επέκταση αυτής της ιδέας στην εταιρική Java, θα πρέπει να συγκεντρωθούν πόροι όπως συνδέσεις βάσεων δεδομένων και κόκκοι επεξεργασίας επιχειρήσεων, ενώ αντικείμενα όπως υπάλληλοι, έγγραφα και widget πρέπει να αποθηκευτούν στην κρυφή μνήμη. Δεν έχει σημασία ποια σύνδεση βάσης δεδομένων λαμβάνει η εφαρμογή σας από μια ομάδα σύνδεσης - όλοι κάνουν το ίδιο πράγμα - αλλά αν θέλετε να δώσετε στον εαυτό σας μια αύξηση μισθών, είναι σημαντικό να αποκτήσετε τα δικα σου αντικείμενο υπαλλήλου.

Κατανόηση των περιοχών JCS

Η χρήση του JCS είναι πραγματικά πολύ απλή, αλλά χρειάζεστε κάποια θεμελιώδη γνώση σχετικά με τον τρόπο με τον οποίο το JCS ορίζει περιοχές cache και πώς μπορούν να διαμορφωθούν. Το αρχείο ιδιοτήτων JCS είναι το λογικό μέρος για να αρχίσετε να κατανοείτε το JCS. Η λίστα 1 εμφανίζει ένα δείγμα αρχείου ιδιοτήτων JCS.

Λίστα 1. Ένα αρχείο ιδιοτήτων JCS (cache.ccf)

# DEFAULT CACHE REGION jcs.default = DC jcs.default.cacheattributes = org.apache.jcs.engine.CompositeCacheAttributes jcs.default.cacheattributes.MaxObjects = 1000 jcs.default.cacheattributes.MemoryCacheName = org.apache.jcs.engine.memory.memine .lru.LRUMemoryCache jcs.default.cacheattributes.UseMemoryShrinker = true jcs.default.cacheattributes.MaxMemoryIdleTimeSeconds = 3600 jcs.default.cacheattributes.ShrinkerIntervalSeconds = 60 jcs.default.elementattributes = org.apache.tt. elementattributes.IsEternal = false jcs.default.elementattributes.MaxLifeSeconds = 21600 jcs.default.elementattributes.IdleTime = 1800 jcs.default.elementattributes.IsSpool = true jcs.default.elementattributes.IsRemote = true jcs.default.elementattributes.IsLateral = # ΠΡΟΤΙΜΩΜΕΝΕΣ ΠΕΡΙΟΧΕΣ CACHE jcs.region.musicCache = DC jcs.region.musicCache.cacheattributes = org.apache.jcs.engine.CompositeCacheAttributes jcs.region.musicCache.cacheattributes.MaxObjects = 1000 jcs.region.musicCache.cacheatt ame = org.apache.jcs.engine.memory.lru.LRUMemoryCache jcs.region.musicCache.cacheattributes.UseMemoryShrinker = true jcs.region.musicCache.cacheattributes.MaxMemoryIdleTimeSeconds = 3600 jcs.region.musicCache.CrcscSccs.sccSecrc. region.musicCache.cacheattributes.MaxSpoolPerRun = 500 jcs.region.musicCache.elementattributes = org.apache.jcs.engine.ElementAttributes jcs.region.musicCache.elementattributes.IsEternal = false # ΔΙΑΘΕΣΙΜΕΣ ΑΞΙΟΛΟΓΙΚΕΣ CACHES jcs.auxiliary.DC = .jcs.auxiliary.disk.indexed.IndexedDiskCacheFactory jcs.auxiliary.DC.attributes = org.apache.jcs.auxiliary.disk.indexed.IndexedDiskCacheAttributes jcs.auxiliary.DC.attributes.DiskPath = c: / temp jcs.auxiliary.DC .attributes.MaxPurgatorySize = 10000000 jcs.auxiliary.DC.attributes.MaxKeySize = 1000000 jcs.auxiliary.DC.attributes.MaxRecycleBinSize = 5000 jcs.auxiliary.DC.attributes.OptimizeAtRemoveCount = 300000 jcs.auxiliary.DC.attributes.ShutdownSpoolTime

Η λίστα 1 περιέχει τρεις ενότητες:

  • Η προεπιλεγμένη περιοχή καθορίζει την προεπιλεγμένη διαμόρφωση για όλες τις περιοχές, εκτός εάν παρακαμφθεί ρητά από μία από τις άλλες περιοχές.
  • Στη συνέχεια είναι μια λίστα προκαθορισμένων (δηλαδή καθορισμένων από το χρήστη) περιοχών προσωρινής αποθήκευσης, οι οποίες σε αυτήν την περίπτωση περιλαμβάνουν το musicCache που θα χρησιμοποιήσω στο επερχόμενο παράδειγμα.
  • Οι βοηθητικές προσωρινές μνήμες ορίζουν βοηθητικοί που μπορεί να συνδεθεί σε μια περιοχή προσωρινής μνήμης. Αν και κάθε περιοχή της προσωρινής μνήμης πρέπει να έχει ένα (και μόνο ένα) βοηθητικό στοιχείο μνήμης, μπορεί να έχει οποιονδήποτε αριθμό άλλων βοηθητικών στοιχείων που μπορούν να διατηρούν προσωρινά αποθηκευμένα δεδομένα. Σε αυτό το παράδειγμα δημιουργώ μια ευρετηριακή κρυφή μνήμη δίσκου, αλλά μπορείτε επίσης να ορίσετε πλευρικός και μακρινός βοηθητικοί. Ένα πλευρικό βοηθητικό μπορεί να αναπαράγει τα προσωρινά αποθηκευμένα δεδομένα σας σε άλλες κρυφές μνήμες μέσω μιας υποδοχής TCP ή μιας στοίβας πρωτοκόλλων JGroups. Ένα απομακρυσμένο βοηθητικό μπορεί να αναπαράγει δεδομένα σε άλλες κρυφές μνήμες μέσω Απομακρυσμένης μεθόδου επίκλησης (RMI).

Κάθε περιοχή μπορεί να καθορίσει χαρακτηριστικά κρυφής μνήμης καθώς χαρακτηριστικά στοιχείου. Ένα χαρακτηριστικό cache καθορίζει μια επιλογή διαμόρφωσης για την προσωρινή μνήμη, ενώ ένα χαρακτηριστικό στοιχείο καθορίζει μια επιλογή διαμόρφωσης για τα στοιχεία της προσωρινής μνήμης. Ακολουθεί μια σύνοψη των επιλογών χαρακτηριστικών cache:

  • MaxObjects: Αυτός είναι ο μέγιστος αριθμός αντικειμένων που επιτρέπονται στη μνήμη.
  • MemoryCacheName: Αυτή η ιδιότητα σάς επιτρέπει να ορίσετε τη διαχείριση μνήμης για χρήση ως δική σας Μνήμη. Ο προεπιλεγμένος διαχειριστής μνήμης εφαρμόζει μια στρατηγική LRU.
  • Χρησιμοποιήστε τοMemoryShrinker: Αυτή η επιλογή επιτρέπει στο JCS να επαναλαμβάνει περιοδικά την προσωρινή μνήμη, αναζητώντας αντικείμενα που μπορούν να αφαιρεθούν (στοιχεία που έχουν λήξει ή έχουν υπερβεί το μέγιστο χρόνο αναμονής μνήμης). Η προεπιλεγμένη τιμή είναι ψευδής.
  • MaxMemoryIdleTimeSeconds: Εάν είναι ενεργοποιημένος ο συρρικνωτής μνήμης, αυτή η ιδιότητα ενημερώνει το JCS για πόσο χρονικό διάστημα ένα αντικείμενο μπορεί να παραμείνει αδρανές πριν το αφαιρέσει ο συρρικνωτής (και το τυλίγει στο δίσκο εάν έχει δημιουργηθεί μια προσωρινή μνήμη δίσκου) Η προεπιλεγμένη τιμή είναι -1, η οποία απενεργοποιεί αυτήν την επιλογή.
  • ΣυρρίκνωσηIntervalSeconds: Εάν είναι ενεργοποιημένος ο συρρικνωτής μνήμης, αυτή η ιδιότητα ενημερώνει το JCS πόσο συχνά εκτελείται η συρρίκνωση. Η προεπιλεγμένη τιμή είναι 60 δευτερόλεπτα.
  • DiskUsagePattern: Εάν είναι ενεργοποιημένη μια προσωρινή μνήμη δίσκου, αυτή η ιδιότητα λέει στο JCS πώς να διατηρήσει δεδομένα όταν η μνήμη cache είναι γεμάτη. Η προεπιλεγμένη τιμή είναι ΑΝΤΑΛΑΓΗ, η οποία περιστρέφει αντικείμενα στο δίσκο μόνο όταν η μνήμη cache είναι γεμάτη. Η άλλη επιλογή είναι ΕΚΣΥΓΧΡΟΝΙΖΩ, που διατηρεί όλα τα δεδομένα στο δίσκο, αλλά μόνο όταν τα δεδομένα ενημερώνονται. Εάν ένα βοηθητικό πρόγραμμα JDBC έχει οριστεί ως προσωρινή μνήμη δίσκου, όλα τα αντικείμενα παραμένουν στη μνήμη (έως ότου η μνήμη είναι πλήρης) και παραμένουν επίσης σε μια βάση δεδομένων, η οποία παρέχει καλή απόδοση καθώς και αξιοπιστία.

Και εδώ είναι οι επιλογές χαρακτηριστικών στοιχείων:

  • IsEternal: Εάν ένα στοιχείο είναι αιώνιο, δεν μπορεί να αφαιρεθεί από την προσωρινή μνήμη επειδή υπερβαίνει τη μέγιστη διάρκεια ζωής του. Αυτή η επιλογή είναι προεπιλεγμένη αληθής.
  • MaxLifeSeconds: Εάν τα στοιχεία δεν είναι αιώνια, αυτή η επιλογή καθορίζει τη μέγιστη διάρκεια ζωής κάθε αντικειμένου προτού αφαιρεθεί. Εάν ο συρρικνωτής μνήμης λειτουργεί, τα αντικείμενα αφαιρούνται από το συρρικνωτή. εάν όχι, καταργούνται όταν έχουν πρόσβαση. Αυτή η επιλογή είναι προεπιλεγμένη -1, η οποία απενεργοποιεί την επιλογή.
  • IsSpool: Αυτή η επιλογή καθορίζει εάν ένα στοιχείο μπορεί να εξουδετερωθεί στο δίσκο. Από προεπιλογή αληθής.
  • IsLateral: Αυτή η επιλογή καθορίζει εάν ένα στοιχείο μπορεί να σταλεί σε μια πλευρική προσωρινή μνήμη. Από προεπιλογή αληθής.
  • IsRemote: Αυτή η επιλογή καθορίζει εάν ένα στοιχείο μπορεί να σταλεί σε μια απομακρυσμένη κρυφή μνήμη. Προεπιλογές αληθής.

Στη λίστα 1, δημιούργησα μια περιοχή με το όνομα musicCache που περιέχει έως και 1.000 αντικείμενα στη μνήμη. Ο διαχειριστής μνήμης χρησιμοποιεί έναν αλγόριθμο LRU: όταν η κρυφή μνήμη είναι πλήρης και το JCS πρέπει να κάνει χώρο για νέα αντικείμενα, θα αφαιρέσει στοιχεία που δεν έχουν προσπελαστεί πρόσφατα. Έχει ενεργοποιημένο το συρρικνωτήρα μνήμης και ο συρρικνωτής λειτουργεί κάθε 60 δευτερόλεπτα. Θα εκδιώξει αντικείμενα που παραμένουν σε αδράνεια για περισσότερα από 60 λεπτά (3.600 δευτερόλεπτα.) Τα αντικείμενά του δεν είναι αιώνια και μπορούν να εγγραφούν σε δίσκο, σε πλευρική προσωρινή μνήμη ή σε απομακρυσμένη προσωρινή μνήμη.

Σημειώστε ότι το IsSpool, IsLateral, και IsRemote Οι ρυθμίσεις μεταβιβάζονται από τις προεπιλεγμένες ρυθμίσεις. Επειδή η jcs.region.musicCache το στοιχείο έχει οριστεί σε DC, ορίζεται όχι μόνο για τη διατήρηση μιας προσωρινής μνήμης στη μνήμη, αλλά και για τη χρήση του ευρετηρίου της προσωρινής μνήμης δίσκου ως βοηθητικού. (Η ιδιότητα μπορεί να οριστεί σε μια λίστα πολλαπλών βοηθητικών στοιχείων διαχωρισμένων με κόμμα.) Η προσωρινή μνήμη δίσκου έχει ρυθμιστεί ώστε να αποθηκεύει αντικείμενα στο c: / θερμοκρασία Ευρετήριο. (Το JCS προτιμά τις κάθετες προς τα πίσω σε κάθετες.) Τα υπόλοιπα χαρακτηριστικά ρυθμίζουν την προσωρινή μνήμη του δίσκου χρησιμοποιώντας ένα IndexedDiskCacheAttribute αντικείμενο; μπορείτε να διαβάσετε σχετικά με αυτά τα χαρακτηριστικά στο JCS Javadoc.

Δημιουργία δείγματος προσωρινής αποθήκευσης

Μόλις καταλάβετε πώς να ρυθμίσετε το JCS, η δημιουργία μιας εφαρμογής προσωρινής αποθήκευσης είναι απλή. Η εφαρμογή πρέπει να είναι σε θέση:

  • Αρχικοποιήστε την προσωρινή μνήμη από το αρχείο διαμόρφωσής της
  • Πρόσβαση σε μια περιοχή στην προσωρινή μνήμη
  • Φόρτωση αντικειμένων στην προσωρινή μνήμη
  • Ανάκτηση αντικειμένων από την προσωρινή μνήμη
  • Αφαιρέστε αντικείμενα από την προσωρινή μνήμη

Η προσωρινή μνήμη μπορεί να αρχικοποιηθεί είτε αυτόματα είτε μη αυτόματα. Εάν ονομάσετε το αρχείο διαμόρφωσης cache.ccf και βάλτε το απευθείας στο δικό σας CLASSPATH (όπως ο κατάλογος root build), τότε την πρώτη φορά που καλείται το JCS, βρίσκει το αρχείο και αρχικοποιεί κατάλληλα. Εάν πρέπει να αποθηκεύσετε το αρχείο διαμόρφωσης αλλού ή να το ονομάσετε διαφορετικά, μπορείτε να χρησιμοποιήσετε το org.apache.jcs.utils.props.PropertyLoader φορτίο Properties () μέθοδος φόρτωσης ιδιοτήτων JCS από οποιοδήποτε αρχείο ιδιοτήτων.

$config[zx-auto] not found$config[zx-overlay] not found