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

Ανθεκτικότητα αντικειμένου και Java

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

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

Κανένα αντικείμενο δεν είναι νησί

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

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

Για ερώτηση ή πλοήγηση;

Κατά την αποθήκευση αντικειμένων σε δίσκο, είμαστε αντιμέτωποι με την επιλογή της συναφής εντοπισμού αντικειμένων για καλύτερη προσαρμογή της πρόσβασης πλοήγησης ή για την αποθήκευση αντικειμένων σε συλλογές τύπου πίνακα που συγκεντρώνουν αντικείμενα ανά τύπο για να διευκολύνουν την πρόσβαση βάσει ερωτημάτων (ερωτήματα) ή και τα δύο . Η συν-τοποθέτηση αντικειμένων σε μόνιμη αποθήκευση είναι μια περιοχή όπου οι σχεσιακές και αντικειμενοστρεφείς βάσεις δεδομένων διαφέρουν πολύ. Η επιλογή της γλώσσας ερωτήματος είναι ένας άλλος τομέας εξέτασης. Η δομημένη γλώσσα ερωτήσεων (SQL) και οι επεκτάσεις της έχουν παράσχει σε σχεσιακά συστήματα έναν μηχανισμό πρόσβασης βασισμένο σε κατηγορηματικά. Το Object Query Language (OQL) είναι μια παραλλαγή αντικειμένου της SQL, τυποποιημένη από το ODMG, αλλά η υποστήριξη για αυτήν τη γλώσσα είναι προς το παρόν περιορισμένη. Οι πολυμορφικές μέθοδοι προσφέρουν άνευ προηγουμένου κομψότητα στην κατασκευή ενός σημασιολογικού ερωτήματος για μια συλλογή αντικειμένων. Για παράδειγμα, φανταστείτε μια πολυμορφική συμπεριφορά για λογαριασμός που ονομάζεται είναιInGoodStanding. Μπορεί να επιστρέψει το Boolean true για όλους τους λογαριασμούς σε καλή κατάσταση, και ψευδώς διαφορετικά. Τώρα φανταστείτε την κομψότητα του ερωτήματος στη συλλογή λογαριασμών, όπου σε καλή κατάσταση εφαρμόζεται διαφορετικά βάσει επιχειρηματικών κανόνων, για όλους τους λογαριασμούς σε καλή κατάσταση. Μπορεί να μοιάζει με:

setOfGoodCustomers = setOfAccounts.query (account.inGoodStanding ());

Ενώ πολλές από τις υπάρχουσες βάσεις δεδομένων αντικειμένων είναι σε θέση να επεξεργαστούν ένα τέτοιο στυλ ερωτήματος σε C ++ και Smalltalk, είναι δύσκολο για αυτούς να το κάνουν για μεγαλύτερες συλλογές (ας πούμε, 500+ gigabyte) και πιο περίπλοκες εκφράσεις ερωτημάτων. Αρκετές από τις σχεσιακές εταιρείες βάσεων δεδομένων, όπως η Oracle και η Informix, σύντομα θα προσφέρουν άλλη σύνταξη βασισμένη σε SQL για να επιτύχουν το ίδιο αποτέλεσμα.

Ανθεκτικότητα και τύπος

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

Κανονικοποίηση και ανεξαρτησία της γλώσσας

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

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

Ένας μηχανισμός για την εκπλήρωση αυτής της εργασίας είναι να εισαγάγει ένα επιπλέον επίπεδο έμμεσης μέσω μιας γλώσσας ορισμού διεπαφής (IDL). Οι διεπαφές βάσεων δεδομένων αντικειμένων μπορούν να γίνουν μέσω του IDL και των αντίστοιχων δομών δεδομένων. Το μειονέκτημα των συνδέσεων στυλ IDL είναι δύο φορές: Πρώτον, το επιπλέον επίπεδο έμμεσης απαιτεί πάντα ένα επιπλέον επίπεδο μετάφρασης, το οποίο επηρεάζει τη συνολική απόδοση του συστήματος. Δεύτερον, περιορίζει τη χρήση υπηρεσιών βάσης δεδομένων που είναι μοναδικές για συγκεκριμένους προμηθευτές και που μπορεί να είναι πολύτιμες για τους προγραμματιστές εφαρμογών.

Ένας παρόμοιος μηχανισμός είναι να υποστηρίζει υπηρεσίες αντικειμένων μέσω επέκτασης του SQL. Σχετικοί προμηθευτές βάσεων δεδομένων και μικρότεροι αντικειμενικοί / σχετικοί προμηθευτές είναι υποστηρικτές αυτής της προσέγγισης. Ωστόσο, πόσο επιτυχημένες θα είναι αυτές οι εταιρείες στη διαμόρφωση του πλαισίου για την αποθήκευση αντικειμένων πρέπει να δούμε.

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

Εγγενής επιμονή Java μέσω σειριοποίησης

Η σειριοποίηση αντικειμένων είναι ο μηχανισμός ειδικής γλώσσας Java για την αποθήκευση και ανάκτηση αντικειμένων Java και πρωτόγονων σε ροές. Αξίζει να σημειωθεί ότι παρόλο που οι εμπορικές βιβλιοθήκες τρίτων για σειριοποίηση αντικειμένων C ++ υπήρχαν εδώ και αρκετό καιρό, το C ++ δεν προσέφερε ποτέ έναν εγγενή μηχανισμό για σειριοποίηση αντικειμένων. Δείτε πώς μπορείτε να χρησιμοποιήσετε τη σειριοποίηση της Java:

// Γράφοντας "foo" σε μια ροή (για παράδειγμα, ένα αρχείο)

// Βήμα 1. Δημιουργήστε μια ροή εξόδου

// δηλαδή, δημιουργήστε κάδο για να λάβετε τα byte

FileOutputStream out = νέο FileOutputStream ("fooFile");

// Βήμα 2. Δημιουργία ObjectOutputStream

// δηλαδή, δημιουργήστε ένα σωλήνα και βάλτε το κεφάλι του στον κάδο

ObjectOutputStream os = νέο ObjectOutputStream (έξω)

// Βήμα 3. Γράψτε μια συμβολοσειρά και ένα αντικείμενο στη ροή

// δηλαδή, αφήστε τη ροή να ρέει στον κάδο

os.writeObject ("foo");

os.writeObject (νέο Foo ());

// Βήμα 4. Ξεπλύνετε τα δεδομένα στον προορισμό του

os.flush ();

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

// Διαβάζοντας ένα αντικείμενο από μια ροή

// Βήμα 1. Δημιουργήστε μια ροή εισόδου

FileInputStream σε = νέο FileInputStream ("fooFile");

// Βήμα 2. Δημιουργήστε μια ροή εισόδου αντικειμένου

ObjectInputStream ins = νέο ObjectInputStream (σε);

// Βήμα 3. Πρέπει να ξέρετε τι διαβάζετε

String fooString = (String) ins.readObject ();

Foo foo = (Foo) s.readObject ();

Σειριοποίηση και ασφάλεια αντικειμένων

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

Ανθεκτικότητα με ακεραιότητα συναλλαγών: Παρουσιάζοντας το JDBC

Διαμορφώθηκε σύμφωνα με το X / Open's SQL CLI (Client Level Interface) και τις αφαιρέσεις ODBC της Microsoft, η σύνδεση βάσης δεδομένων Java (JDBC) στοχεύει στην παροχή ενός μηχανισμού σύνδεσης βάσης δεδομένων που είναι ανεξάρτητος από το υποκείμενο σύστημα διαχείρισης βάσεων δεδομένων (DBMS). Για να γίνει συμβατό με το JDBC, προγράμματα οδήγησης πρέπει να υποστηρίξει τουλάχιστον το API ANSI SQL-2 entry-level, το οποίο παρέχει σε τρίτους προμηθευτές εργαλείων και εφαρμογές αρκετή ευελιξία για πρόσβαση στη βάση δεδομένων.

Το JDBC έχει σχεδιαστεί για να είναι συνεπές με το υπόλοιπο σύστημα Java. Οι προμηθευτές ενθαρρύνονται να γράψουν ένα API που είναι πιο έντονα δακτυλογραφημένο από το ODBC, το οποίο παρέχει μεγαλύτερο στατικό έλεγχο τύπου κατά το χρόνο μεταγλώττισης.

Ακολουθεί μια περιγραφή των πιο σημαντικών διεπαφών JDBC:

  • java.sql.Driver.Manager χειρίζεται τη φόρτωση προγραμμάτων οδήγησης και παρέχει υποστήριξη για νέες συνδέσεις βάσης δεδομένων.

  • java.sql.Σύνδεση αντιπροσωπεύει μια σύνδεση με μια συγκεκριμένη βάση δεδομένων.

  • java.sql. Δήλωση ενεργεί ως κοντέινερ για την εκτέλεση μιας δήλωσης SQL σε μια δεδομένη σύνδεση.

  • java.sql.ResultSet ελέγχει την πρόσβαση στο σύνολο αποτελεσμάτων.

Μπορείτε να εφαρμόσετε ένα πρόγραμμα οδήγησης JDBC με διάφορους τρόπους. Το απλούστερο θα ήταν να δημιουργήσετε το πρόγραμμα οδήγησης ως γέφυρα στο ODBC. Αυτή η προσέγγιση είναι πιο κατάλληλη για εργαλεία και εφαρμογές που δεν απαιτούν υψηλή απόδοση. Μια πιο επεκτάσιμη σχεδίαση θα εισαγάγει ένα επιπλέον επίπεδο έμμεσης στο διακομιστή DBMS παρέχοντας ένα πρόγραμμα οδήγησης δικτύου JDBC που έχει πρόσβαση στον διακομιστή DBMS μέσω ενός δημοσιευμένου πρωτοκόλλου. Το πιο αποτελεσματικό πρόγραμμα οδήγησης, ωστόσο, θα έχει άμεση πρόσβαση στο ιδιόκτητο API DBMS.

Βάσεις δεδομένων αντικειμένων και επιμονή Java

Ορισμένα έργα που βρίσκονται σε εξέλιξη στον κλάδο προσφέρουν επιμονή Java σε επίπεδο αντικειμένου. Ωστόσο, από αυτήν τη συγγραφή, το Object Design's PSE (Persistent Storage Engine) και το PSE Pro είναι τα μόνα πλήρως βασισμένα σε Java, αντικειμενοστραφή πακέτα βάσεων δεδομένων (τουλάχιστον, για τα οποία γνωρίζω). Ανατρέξτε στην ενότητα Πόροι για περισσότερες πληροφορίες σχετικά με το PSE και το PSE Pro.

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

Το PSE Pro έχει τη δυνατότητα ανάκτησης κατεστραμμένης βάσης δεδομένων από μια ματαιωμένη συναλλαγή που προκαλείται από αποτυχία του συστήματος. Οι κλάσεις που είναι υπεύθυνες για αυτήν την προστιθέμενη λειτουργικότητα δεν υπάρχουν στην έκδοση PSE. Δεν υπάρχουν άλλες διαφορές μεταξύ των δύο προϊόντων. Αυτά τα προϊόντα είναι αυτό που ονομάζουμε "dribbleware" - εκδόσεις λογισμικού που ενισχύουν τη λειτουργικότητά τους συνδέοντας νέα στοιχεία. Στο όχι τόσο μακρινό μέλλον, η έννοια της αγοράς μεγάλου, μονολιθικού λογισμικού θα γινόταν παρελθόν. Το νέο επιχειρηματικό περιβάλλον στον κυβερνοχώρο, μαζί με τον υπολογισμό Java, επιτρέπει στους χρήστες να αγοράζουν μόνο εκείνα τα μέρη του μοντέλου αντικειμένων (γράφημα αντικειμένων) που χρειάζονται, με αποτέλεσμα πιο συμπαγή τελικά προϊόντα.

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