Programavimas

Objekto atkaklumas ir „Java“

Objekto patvarumas arba atkaklumasyra terminas, kurį dažnai girdite, vartojamas kartu su objekto saugojimo duomenų bazėse klausimu. Tikimasi, kad atkaklumas veiks vientisai sandoriams, todėl jam taikomos griežtos sąlygos. (Daugiau informacijos apie operacijų apdorojimą žr. Šio straipsnio skyriuje.) Priešingai, kalbų paslaugoms, siūlomoms per standartines kalbų bibliotekas ir paketus, dažnai netaikomi sandorių apribojimai.

Kaip pamatysime šiame straipsnyje, įrodymai rodo, kad paprastas „Java“ atkaklumas greičiausiai atsiras dėl pačios kalbos, o sudėtingą duomenų bazės funkcionalumą pasiūlys duomenų bazių pardavėjai.

Nė vienas objektas nėra sala

Realiame pasaulyje retai randate objektą, kuriam trūksta santykių su kitais objektais. Objektai yra objektų modeliai. Objekto patvarumo klausimas peržengia objekto modelio patvarumo ir paskirstymo klausimą, kai mes pastebime, kad objektai yra tarpusavyje susiję dėl jų tarpusavio santykių.

Santykinis požiūris į duomenų saugojimą yra linkęs kaupti duomenis pagal tipą. Lentelės eilutės rodo fizinį to paties tipo objektų agregatą diske. Santykius tarp objektų vaizduoja raktai, kurie bendrinami daugelyje lentelių. Nors organizuojant duomenų bazes, reliacinės duomenų bazės kartais leidžia kartu naudoti lenteles, kurios greičiausiai bus naudojamos kartu (arba susitelkęs) tame pačiame loginiame skaidinyje, pvz., duomenų bazės segmente, jie neturi mechanizmo objekto ryšiams saugoti duomenų bazėje. Taigi, norint sukurti objekto modelį, šie ryšiai yra konstruojami iš esamų raktų vykdymo metu procese, kuris vadinamas stalas prisijungia. Tai ta pati žinoma reliacinių duomenų bazių, vadinamų, ypatybė duomenų nepriklausomumas. Beveik visi objektų duomenų bazių variantai siūlo tam tikrą mechanizmą, kuris pagerintų sistemos, apimančios sudėtingus objektų ryšius, palyginti su tradicinėmis reliacinėmis duomenų bazėmis, našumą.

Norėdami pateikti užklausą ar naršyti?

Saugodami objektus diske, mes pasirenkame kartu surasti susijusius objektus, kad geriau pritaikytume navigacijos prieigą, arba saugoti objektus į lenteles panašiuose rinkiniuose, kurie objektus kaupia pagal tipą, kad palengvintų prieigą prie predikatų (užklausas), arba abu . Objektų vieta nuolatinėje saugykloje yra sritis, kurioje reliacinės ir į objektą orientuotos duomenų bazės labai skiriasi. Užklausos kalbos pasirinkimas yra dar viena svarstymo sritis. Struktūrizuota užklausų kalba (SQL) ir jos plėtiniai suteikė reliacinėms sistemoms predikatu pagrįstą prieigos mechanizmą. Object Query Language (OQL) yra SQL objekto variantas, standartizuotas ODMG, tačiau šios kalbos palaikymas šiuo metu yra menkas. Polimorfiniai metodai suteikia precedento neturinčią eleganciją kuriant semantinę objektų kolekcijos užklausą. Pavyzdžiui, įsivaizduokite polimorfinį elgesį sąskaitą paskambino isInGoodStanding. Tai gali grąžinti Bulio reikšmę teisingai visoms geros būklės sąskaitoms, o kitu atveju - klaidingai. Dabar įsivaizduokite eleganciją, kur klausinėti sąskaitų rinkinio inGoodStanding įgyvendinamas skirtingai, remiantis verslo taisyklėmis, visose geros būklės sąskaitose. Tai gali atrodyti maždaug taip:

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

Nors kelios esamos objekto duomenų bazės gali apdoroti tokį užklausos stilių C ++ ir „Smalltalk“, joms sunku tai padaryti didesnių (tarkime, daugiau nei 500 gigabaitų) kolekcijų ir sudėtingesnių užklausų išraiškų atveju. Kelios reliacinių duomenų bazių įmonės, tokios kaip „Oracle“ ir „Informix“, netrukus pasiūlys kitą, SQL pagrįstą sintaksę, kad pasiektų tą patį rezultatą.

Patvarumas ir tipas

Į objektą orientuotas kalbos mėgėjas pasakytų, kad patvarumas ir tipas yra stačiosios objekto savybės; tai yra, to paties tipo patvarūs ir praeinantys objektai gali būti identiški, nes viena savybė neturėtų daryti įtakos kitai. Alternatyvi nuomonė teigia, kad patvarumas yra elgesys, palaikomas tik patvarių objektų, o tam tikra elgsena gali būti taikoma tik patvariems objektams. Pastarasis metodas reikalauja metodų, nurodančių patvariems objektams saugoti ir paimti iš nuolatinės saugyklos, o pirmasis suteikia programai vientisą viso objekto modelio vaizdą - dažnai išplėsdamas virtualiosios atminties sistemą.

Kanikalizacija ir kalbos nepriklausomybė

To paties tipo objektai kalboje turėtų būti saugomi nuolatinėje saugykloje su tuo pačiu išdėstymu, neatsižvelgiant į jų sąsajų rodymo tvarką. Objektų išdėstymo transformavimo į šį bendrą formatą procesai bendrai vadinami objekto vaizdavimo kanonizavimu. Kompiliuojamose kalbose su statinio rinkimo (ne „Java“) objektais, parašytais ta pačia kalba, tačiau sudarytais skirtingose ​​sistemose, nuolatinėje saugykloje turėtų būti identiški vaizdai.

Kanonizacijos išplėtimas nukreipia nuo kalbos nepriklausomą objektų vaizdavimą. Jei objektai gali būti vaizduojami nepriklausomai nuo kalbos, skirtingiems to paties objekto vaizdams bus galima naudoti tą pačią nuolatinę saugyklą.

Vienas iš šios užduoties atlikimo mechanizmų yra įvesti papildomą netiesioginio ryšio lygį per sąsajos apibrėžimo kalbą (IDL). Objektų duomenų bazių sąsajas galima sukurti per IDL ir atitinkamas duomenų struktūras. Neigiami IDL stiliaus įrišimų variantai yra du: pirma, dėl papildomo nukreipimo lygio visada reikia papildomo vertimo lygio, kuris turi įtakos bendram sistemos veikimui; antra, tai riboja duomenų bazių paslaugų, kurios yra unikalios konkretiems pardavėjams, naudojimą ir kurios gali būti naudingos programų kūrėjams.

Panašus mechanizmas yra palaikyti objekto paslaugas per SQL plėtinį. Reliacinių duomenų bazių pardavėjai ir mažesni objektų / reliacijų tiekėjai yra šio požiūrio šalininkai; tačiau kol kas dar laukia šių kompanijų sėkmės formuojant objektų saugojimo sistemą.

Tačiau išlieka klausimas: ar objekto patvarumas yra objekto elgesio dalis, ar tai išorinė paslauga, siūloma objektams per atskiras sąsajas? Kaip būtų su objektų kolekcijomis ir metodais, kaip juos atlikti? Santykiniai, išplėstiniai santykiai ir objektiniai / reliaciniai požiūriai yra linkę propaguoti kalbos atskyrimą, o objektų duomenų bazės - ir pati „Java“ kalba - teigia, kad atkaklumas yra būdingas kalbai.

Gimtoji „Java“ atkaklumas naudojant nuoseklųjį suderinimą

Objektų nuoseklinimas yra „Java“ kalbai būdingas mechanizmas, skirtas „Java“ objektams ir primityviems elementams saugoti ir gauti į srautus. Verta pažymėti, kad nors komercinės trečiųjų šalių bibliotekos, skirtos C ++ objektams serijizuoti, egzistuoja jau kurį laiką, C ++ niekada nesiūlė savojo objekto serializavimo mechanizmo. Štai kaip naudoti „Java“ serizavimą:

// „foo“ įrašymas į srautą (pvz., Failą)

// 1 žingsnis. Sukurkite išvesties srautą

tai yra sukurkite grupę baitams gauti

FileOutputStream out = new FileOutputStream ("fooFile");

// 2 žingsnis. Sukurkite „ObjectOutputStream“

// tai yra sukurkite žarną ir įdėkite galvą į kibirą

ObjectOutputStream os = new ObjectOutputStream (out)

// 3 žingsnis. Įrašykite eilutę ir objektą į srautą

tai yra, tegul srautas teka į kibirą

os.writeObject ("foo");

os.writeObject (naujas Foo ());

// 4 žingsnis. Nuplaukite duomenis į paskirties vietą

os.skalauti ();

Rašymo objektas metodas serijuoja foo ir jo pereinamąjį uždarymą, ty visus objektus, į kuriuos grafike galima nurodyti iš foo. Sraute yra tik viena serijinio objekto kopija. Kitos nuorodos į objektus saugomos kaip objektų rankenos, siekiant sutaupyti vietos ir išvengti žiedinių nuorodų. Serijinis objektas prasideda klase, po kurios paveldėjimo hierarchijoje yra kiekvienos klasės laukai.

// Objekto skaitymas iš srauto

// 1 žingsnis. Sukurkite įvesties srautą

FileInputStream in = new FileInputStream ("fooFile");

// 2 žingsnis. Sukurkite objekto įvesties srautą

ObjectInputStream ins = new ObjectInputStream (in);

// 3 žingsnis. Turėjau žinoti, ką skaitai

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

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

Objektų serijavimas ir apsauga

Pagal numatytuosius nustatymus serializavimas iš srauto rašo ir skaito ne statinius ir nepereinamuosius laukus. Šią charakteristiką galima naudoti kaip saugumo mechanizmą, laukus, kurie gali būti neserijuoti, paskelbiant kaip asmeninius pereinamuosius. Jei klasė gali būti nesuderinama, writeObject ir readObject turėtų būti įgyvendinami metimo metodai „NoAccessException“.

Nuolatumas su sandorių vientisumu: pristatome JDBC

Remiantis „X / Open“ SQL CLI (kliento lygio sąsaja) ir „Microsoft“ ODBC abstrakcijomis, „Java“ duomenų bazės ryšiu (JDBC) siekiama pateikti duomenų bazės ryšio mechanizmą, kuris būtų nepriklausomas nuo pagrindinės duomenų bazių valdymo sistemos (DBVS). Norėdami tapti suderinamais su JDBC, tvarkyklės reikia palaikyti bent jau ANSI SQL-2 pradinio lygio API, kuri suteikia trečiųjų šalių įrankių tiekėjams ir programoms pakankamai lankstumo norint pasiekti duomenų bazę.

JDBC sukurtas taip, kad atitiktų likusią „Java“ sistemą. Pardavėjai raginami rašyti API, kuri yra griežtesnė nei ODBC, kuri suteikia didesnį statinį tipo tikrinimą kompiliavimo metu.

Čia pateikiamas svarbiausių JDBC sąsajų aprašymas:

  • java.sql.Driver.Manager tvarko tvarkykles ir palaiko naujas duomenų bazių jungtis.

  • java.sql. Ryšys reiškia ryšį su tam tikra duomenų baze.

  • java.sql. Pareiškimas veikia kaip konteineris SQL sakiniui vykdyti tam tikrame ryšyje.

  • java.sql.ResultSet kontroliuoja prieigą prie rezultatų rinkinio.

JDBC tvarkyklę galite įdiegti keliais būdais. Paprasčiausia būtų pastatyti vairuotoją kaip tiltą į ODBC. Šis metodas geriausiai tinka įrankiams ir programoms, kurioms nereikia didelio našumo. Išplėstinis dizainas suteiktų papildomą netiesioginės informacijos lygį DBVS serveriui, suteikiant JDBC tinklo tvarkyklę, prieigą prie DBVS serverio per paskelbtą protokolą. Tačiau efektyviausias tvarkyklė tiesiogiai pasiektų DBVS nuosavybės API.

Objektų duomenų bazės ir „Java“ patvarumas

Nemažai šioje srityje vykdomų projektų siūlo „Java“ atkaklumą objekto lygiu. Tačiau nuo šio rašymo „Object Design“ PSE („Persistent Storage Engine“) ir „PSE Pro“ yra vieninteliai galimi visiškai Java pagrįsti, į objektus orientuoti duomenų bazių paketai (bent jau aš apie juos žinau). Daugiau informacijos apie PSE ir PSE Pro rasite skyriuje Ištekliai.

„Java“ kūrimas leido nukrypti nuo tradicinės programinės įrangos gamintojų kūrimo paradigmos, ypač kūrimo proceso laiko juostoje. Pavyzdžiui, PSE ir PSE Pro yra kuriami heterogeniškoje aplinkoje. Kadangi kūrimo procese nėra susiejančio žingsnio, kūrėjai sugebėjo sukurti įvairius funkcinius komponentus, nepriklausomus vienas nuo kito, o tai lemia geresnį, patikimesnį į objektą orientuotą kodą.

„PSE Pro“ turi galimybę atkurti sugadintą duomenų bazę iš nutrauktos operacijos, kurią sukelia sistemos gedimas. Klasių, atsakingų už šią papildomą funkciją, nėra PSE leidime. Jokių kitų skirtumų tarp šių dviejų produktų nėra. Šiuos produktus mes vadiname „dribbleware“ - programinės įrangos leidimais, kurie pagerina jų funkcionalumą prijungdami naujus komponentus. Ne taip ir tolimoje ateityje didelės monolitinės programinės įrangos įsigijimo koncepcija taptų praeitimi. Nauja verslo aplinka virtualioje erdvėje kartu su „Java“ skaičiavimais suteikia vartotojams galimybę įsigyti tik tas objekto modelio dalis (objektų diagramą), kurių jiems reikia, todėl gaunami kompaktiškesni galutiniai produktai.

PSE veikia po apdorojimo ir anotacijų klasės failams, kai juos sukūrė kūrėjas. PSE požiūriu, objekto grafiko klasės gali būti nuolatinės arba nuolatinės. Patvariai pajėgios klasės gali išlikti pačios, o atkakliai žinančios klasės gali veikti patvarius objektus. Šis skirtumas yra būtinas, nes atkaklumas tam tikroms klasėms gali būti nenorimas elgesys. Klasės failo perdirbėjas atlieka šiuos klasių pakeitimus: