ΠάρηςΓ Δημοσ. 16 Μαΐου 2011 Δημοσ. 16 Μαΐου 2011 Γεια σας παιδες.... Θελω να φτιαξω μια web εφαρμογή και επειδη ειμαι ψειρας εχω κολήσει σε μια λεπτομέρια... Δεν ξερω πως να διαχειριστώ τις συνδέσεις στη βαση δεδομένων. Το προβλημα ειναι πως δεν μιλάμε για σχεσιακή βαση δεδομένων αλλά για κλειδιού - τιμής κατα καποιο τροπο.. http://www.oracle.com/technetwork/database/berkeleydb/overview/index.html Να εξηγησω τι θέλω Σε γενικές γραμμές για να πετυχεις κλειδωματα, δοσοληψιες κτλ η βαση θελει ενα environment.Στην ουσια ειναι καποια αρχεια σε ενα φακελο που θες και αυτα συντονιζουν κατα καποιο τροπο τα παντα.... Υπαρχει μια κλάση Environment που το κανει αυτο.... Πιστευω οτι αυτο με ενα singleton pattern ειτε με μεθοδο enum είτε με το @Singleton EJB ειναι ενταξει να κραταει το instance της environment.... Αρα απο αυτο ειμαστε ενταξει πιστευω.. Μετα ακολουθει το βημα να ανοιξεις τις βασεις... Ειναι γυρω στα 90 + διαφορετικα αρχεια + καποια αλλα καθε μερα....Ειναι χυμα ετσι γιατι τα αρχεια γιατι η εφαρμογή ειχε σχεδιαστεί το ~ 1975 Cobol με κατι ντουλαπες σκληρους δισκους που εχουν γινει κορνίζα πια. Μια λύση θα ηταν σε κάθε request να ανοιγω τα αρχεία-βασεις και να τα κλείνω.Αλλα το θεωρω λιγο gay εφοσον οι κλάσεις Database ειναι thread-safe απο τη μανα τους. Δηλαδή σκέφτομαι να μοιραζονται τις συνδεσεις τα διαφορα request. Για αυτο εχω σκεφτει μια Singleton κλαση που θα εχει μια μεθοδο getDatabase(String databaseName) και θα βλεπει σε εναν ConcurrentHashMap αν υπαρχει ανοιχτή σύνδεση και να θα επιστρεφει το handle.. Με double check locking θα ειναι μια χαρα πιστεύω αυτο. Το προβλημα ειναι πως θα κλείνουν ομως... Δηλαδη ενταξει για τα στανταρ αρχεια ας μενουν αλλα για τα καθημερινά; Σε ενα μηνα θα εχει καμια 60 αχρηστα! 1. Η μια λύση ειναι με καποιο Timer να κλείνει τα παλαια handle πχ καθε 24 ωρες με βοηθεια timestamp αλλα πως θα ξερω 100% οτι δε χρησιμοποιείται απο καποιο thread; Απιθανο να εκτελειται κωδικας ομωε επι 24 ωρες αλλα δεν μου αρεσει κατι σε αυτη τη προσεγγιση.. 2.Η αλλη λυση ειναι να φτιαχνει προσωρινή συνδεση για τα μη σταναρ και να κλείνει καπάκι.. Οσο το σκεφτομαι τεινω στο 1 και αν ποτε χρειαστεί να γραψω κατι που θα κανει να εκτελεστει πανω απο 24 (πολυπλοκα στατισικα που ρουφαει ολη τη βαση)- μαλλον απιθανο θα βαλω ξεχωριστες συνδεσεις.. Βεβαια για το ενα δεν ειμαι σιγουρος πως να πετυχω synchronization... Tρεχει το timer πως θα σιγουρευτω οτι η getDatabase() δεν εκτελείται;Δηλαδη ενω θα γινεται η λούπα στις συνδεσεις και θα βλεπει πιες δεν ειναι μονιμες με καποιο flag, θα συγκρινει το timestamp τελευταιου get και θα το κλείνει.Ομως πως διασφαλίζω οτι ανάμεσα στο if(myDatabase.lastGetTimestamp .......> 24 ώρες).. { ---εδω--- myDatabase.close(); cache.remove(myDatabase.name,myDatabase); } δεν εχει αλλαξει το timestamp ; Είμαι λιγο αρχαριος στα νήματα... Οποιες προτάσεις δεκτες!
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.