Service Data Objects - JDBC Mediator |
|
|
Rulare | Note tehnice | Javadoc | Construire cu Ant |
Privire generală asupra tehnologiei |
Privire generală asupra exemplului |
Localizarea tabelelor de bază de date |
Localizarea codului sursă |
Examinarea notelor despre codare |
Tehnologia Service Data Objects (SDO) este un mecanism de acces la date în mod deconectat, axat pe date, care furnizează un set de rezultate independent de sursă: Datagraph.JDBC Mediator:
Tehnologia SDO are la bază două concepte principale:
- Datagraph: Un Datagraph este structura de date de tip graf rezultată în urma unei interogări, furnizată într-un răspuns. Fiecare nod din Datagraph, inclusiv nodul rădăcină, este de tip DataObject.
- Data Mediator Service: Data Mediator Service (DMS) asigură acces SDO la o sursă de date. De exemplu, JDBC Mediator permite unui client să interogheze o bază de date relaţională şi să extragă datele sub forma unui Datagraph. DMS returnează DataObject-ul rădăcină al Datagraph-ului, din care pot fi accesate toate DataObject-urile din graf.
![]()
JDBC Mediator este un tip de Data Mediator Service SDO. Permite clienţilor să execute operaţii asupra unei baze de date relaţionale prin intermediul SDO-urilor. Utilizând JDBC Mediator, clienţii pot să extragă date relaţionale sub forma unui Datagraph, să realizeze operaţii Create, Read, Update şi Delete asupra Datagraph-ului şi să comită în baza de date Datagraph-ul modificat.
Există un concept care este specific pentru JDBC Mediator:
- Metadate relaţionale: Metadatele relaţionale sunt o descriere parţială a schemei de bază de date, care este utilizată în interogare. Sunt descrise tabelele, coloanele, cheile primare, condiţiile de filtrare şi relaţiile utilizate în interogare. Un client JDBC Mediator trimite metadatele relaţionale la JDBC Mediator înainte de a cere un Datagraph. JDBC Mediator utilizează aceste informaţii pentru a realiza interogări în baza de date şi a determina structura Datagraph-ului rezultat.
Reţineţi că JDBC Mediator furnizează două opţiuni pentru a descrie interogarea:
- Prin API-urile JDBC Mediator de metadate relaţionale.
- Printr-un şir de interogare SQL furnizat de client.
Exemplul AlbumCatalog este o aplicaţie web J2EE care utilizează API-urile JDBC şi SDO Mediator pentru a executa operaţii Create, Read, Update şi Delete într-o bază de date relaţională. Aplicaţia realizează aceste operaţii în două tabele: Band şi Album.
Aplicaţia demonstrează de asemenea următoarele caracteristici cheie ale tehnologiei:
- Set de rezultate în mod deconectat:
În continuare este prezentat un scenariu din acest exemplu, care ilustrează caracteristica SDO în mod deconectat:
- Adăugarea unui grup:
- utilizatorul specifică numele şi genul grupului, apoi face clic pe "Add Band"
- este creat un Datagraph nou
- în Datagraph este adăugat un DataObject pentru noul grup
- modificările realizate în Datagraph - DataObject-ul adăugat pentru noul grup - sunt comise în baza de date.
- Datagraph-ul este stocat în sesiunea HTTP şi apoi afişat pentru utilizator. Reţineţi că prin comiterea Datagraph-ului în baza de date, DataObject-urile din Datagraph nu sunt epurate; o comitere nu face decât să transfere în baza de date datele modificate.
- Adăugarea unui nou album pentru grup:
- utilizatorul face clic pe butonul "Add Albums"
- Datagraph-ul creat mai sus este extras din sesiunea HTTP
- în Datagraph este adăugat un DataObject pentru noul album; numai proprietatea BANDNAME a DataObject-ului noului album este populată cu numele grupului pentru care a fost creat albumul. Acest DataObject populat parţial este afişat utilizatorului.
- utilizatorul specifică numele albumului, anul şi piesele recomandate, apoi face clic pe "Create Album". Acum câmpurile ALBUMNAME, ALBUMYEAR şi RECOMMENDEDTRACKS din DataObject-ul noului album sunt populate.
- în acest punct, utilizatorul are opţiunea de a comite albumul în baza de date sau de a adăuga alt album. Reţineţi că utilizatorul poate adăuga oricâte albume doreşte înainte de a realiza comiterea în baza de date. Aceasta este o demonstraţie a manipulării în mod deconectat a datelor relaţionale.
- în final, utilizatorul comite în baza de date albumele adăugate făcând clic pe "Commit Albums".
- Relaţiile dintre tabele:
Prin intermediul metadatelor relaţionale, pot fi definite relaţii între două tabele. În acest exemplu, este definită o relaţie între câmpurile NAME şi BANDNAME ale tabelei Band, respectiv Album. Apoi, când este extras un Datagraph având definită această relaţie, fiecare DataObject Band din Datagraph va avea de asemenea o listă de DataObject-uri Album. Este ceva similar cu realizarea unei uniuni într-o interogare SQL. Reţineţi că relaţiile sunt definite între cheile din două tabele. Pentru informaţii suplimentare, consultaţi notele privind codarea AlbumCatalogMetadata.
Reţineţi că nu sunt specificate restricţii privind cheile externe din baza de date Cloudscape a acestui exemplu. Consultaţi Centrul de informare WebSphere Application Server pentru detalii privind caracteristica Relationships a tehnologiei JDBC Mediator.- Controlul optimist al concurenţei:
JDBC Mediator utilizează o strategie OCC (Optimistic Concurrency Control - Controlul optimist al concurenţei) pentru a comite modificările în baza de date; aceasta înseamnă că nu sunt reţinute blocările bazei de date atunci când este extras un Datagraph. Când JDBC Mediator încearcă să comită în baza de date un Datagraph actualizat, verifică dacă rândul a fost modificat de la momentul extragerii Datagraph-ului; dacă rândul a fost modificat, este lansată o excepţie de coliziune. O excepţie de coliziune conţine valoarea originală a rândului, valoarea curentă a rândului şi valoarea încercată a rândului, pentru rândul pentru care a apărut prima coliziune. Aplicaţia poate apoi să utilizeze informaţiile din excepţia de coliziune pentru a determina comportamentul ulterior.OCC îmbunătăţeşte performanţa, deoarece datele nu sunt blocate la extragerea Datagraph-urilor, ceea ce reduce accesările bazei de date.
Implicit, JDBC Mediator nu utilizează toate tabelele din metadatele relaţionale pentru OCC; un client JDBC Mediator trebuie să specifice care tabele cu metadate relaţionale necesită OCC. Aceasta se face prin:
- adăugarea în tabelă a unei coloane Integer pentru OCC: JDBC Mediator utilizează o coloană dedicată din tabelă pentru a implementa OCC. Această coloană trebuie să fie de tip Integer şi este utilizată numai de JDBC Mediator.
- specificarea în metadatele relaţionale că respectiva coloană va fi utilizată pentru OCC.
AlbumCatalog utilizează OCC pentru tabela Album. Coloana RECOMMMENDEDTRACKS din tabela Album conţine singurele date care pot fi actualizate în acest exemplu. Examinaţi codul sursă al exemplului pentru a vedea cum este implementat.
Consultaţi Centrul de informare WebSphere Application Server pentru detalii privind caracteristica OCC a tehnologiei JDBC Mediator.
Utilizatorii z/OS: Codul sursă pentru exemple nu este furnizat pe platforma z/OS, deoarece aplicaţiile exemplu nu sunt construite pe platforma z/OS.
Privire generală |
AlbumCatalogServlet |
AlbumCatalogJDBCSDOService |
AlbumCatalogMetadata |
JSP-uri |
Album Catalog respectă tiparul Model-Vizualizare-Controler, găsit în majoritatea aplicaţiilor web. În continuare sunt prezentate pe scurt componentele de aplicaţie, împărţite după rolurile lor:
- Model: Modelul este furnizat de SDO.
- Vizualizare: Toate JSP-urile din aplicaţie asigură vizualizarea. AlbumCatalog.jsp este punctul de intrare al aplicaţiei. Reţineţi că în JSP-uri se utilizează Java Server Pages Standard Tag Library (JSTL).
- Controler: Servletul controler al aplicaţiei este AlbumCatalogServlet.
Diagrama secvenţială a operaţiei de găsire a unui album:
![]()
Explicaţia diagramei secvenţiale de mai sus:
- AlbumCatalogServlet:
- primeşte de la AlbumCatalog.jsp cererea de a găsi un album
- invocă metoda findAlbum din AlbumCatalogJDBCSDOService
- AlbumCatalogJDBCSDOService:
- obţine metadatele relaţionale pentru tabele din AlbumCatalogMetadata. Metadatele relaţionale sunt create cu API-urile de metadate din JDBC Mediator şi pot descrie coloane, relaţii şi interogări. Reţineţi că există două modalităţi pentru a descrie o interogare: a) cu API-uri de metadate relaţionale b) cu un şir de interogare SQL. Pentru operaţia de găsire a unui album (findAlbum), este utilizată metoda a); examinaţi operaţia findBand pentru un exemplu de utilizare a metodei b).
- obţine Conexiune pentru sursa de date AlbumDB şi creează un obiect ConnectionWrapper
- construieşte o interogare SQL pe baza informaţiilor de parametru transmise din servlet.
- creează un JDBC Mediator utilizând metadatele relaţionale, ConnectionWrapper şi şirul de interogare SQL.
- extrage un Datagraph din JDBC Mediator. Reţineţi că JDBCMediator returnează DataObject-ul rădăcină al grafului; toate DataObject-urile din graf sunt accesibile din DataObject-ul rădăcină.
- AlbumCatalogServlet plasează apoi DataObject-ul rădăcină în sesiunea HTTP şi înaintează cererea HTTP către displayAlbums.jsp
- displayAlbum.jsp:
- utilizează JSTL pentru a accesa DataObject-uri.
- sunt utilizate expresii EL pentru a specifica proprietăţile unui DataObject.
- De exemplu, pentru a extrage numele primului DataObject de album din DataObject-ul rădăcină, poate fi utilizată următoarea expresie EL: "${albumRootDataObject.ALBUM[0].ALBUMNAME}". În codul Java, aceasta este similară cu:
- List albums = (List) albumRootDataObject.get("ALBUM");
- DataObject firstAlbumDataObject = (DataObject) albumRootDataObject.get(0);
- String firstAlbumName = firstAlbumDataObject.getString("ALBUMNAME");
- Reţineţi că rezultatele pentru o tabelă sunt accesate prin invocarea "get(NAMEOFTABLE)" pentru DataObject-ul rădăcină; aceata returnează Lista de DataObject-uri, fiecare DataObject reprezentând un rând din tabelă. Apoi sunt accesate coloanele din rândul respectiv prin apelarea "get(NAMEOFCOLUMN)" pentru DataObject-ul respectiv.
AlbumCatalogServlet este servletul controler al acestui exemplu. JSP-urile postează cereri către acest servlet, pentru realizarea următoarelor funcţii:
- interogarea/actualizarea bazei de date - AlbumCatalogServlet utilizează AlbumCatalogJDBCSDOService pentru a extrage/comite Datagraph-uri.
- punerea DataObject-ului rădăcină al Datagraph-urilor în sesiunea HTTP, astfel ca JSP-urile să poată accesa datele.
AlbumCatalogJDBCSDOService furnizează metodele pentru extragerea şi comiterea Datagraph-urilor. Realizează următoarele:
- punerea în cache a sursei de date utilizate de AlbumCatalog
- furnizarea metodelor publice pentru extragerea/comiterea Datagraph-urilor.
De exemplu, metoda findAlbum(String albumToFind) face următoarele:
- creează un obiect ConnectionWrapper (un wrapper din API-ul JDBC Mediator, care este utilizat de JDBC Mediator pentru conectarea la baza de date)
- obţine metadatele relaţionale pentru tabela Album din AlbumCatalogMetadata
- construieşte şirul de interogare SQL
- utilizează metadatele relaţionale, ConnectionWrapper şi şirul de interogare SQL pentru a crea o instanţă a JDBC Mediator
- extrage un Datagraph din JDBC Mediator
AlbumCatalogMetadata furnizează metadatele relaţionale pentru baza de date Album Catalog. Metadatele relaţionale sunt informaţiile de care are nevoie JDBC Mediator pentru a realiza interogări în baza de date relaţională. Aceasta clasă este utilizată de AlbumCatalogJDBCSDOService pentru:
- obţinerea definiţiilor de tabelă din tabelele Album şi Band
- adăugarea în metadatele relaţionale a unor filtre pentru anumite coloane. De exemplu, pentru a căuta un grup după nume, în metadatele relaţionale este adăugat un filtru pentru coloana NAME din tabela Band.
- definirea relaţiilor dintre tabele în metadatele relaţionale. Aşa cum s-a arătat mai sus în prezentarea generală a tehnologiei, definirea relaţiilor în metadate este similară cu realizarea unei uniuni între două tabele.
Există două tipuri de relaţii:
- Exclusivă: echivalentă cu o uniune internă (inner join). Aceasta este opţiunea implicită.
- Neexclusivă: echivalentă cu o uniune externă la stânga (left outer join)
Reţineţi că termenul "cheie externă", utilizat atunci când sunt definite relaţiile în metadatele relaţionale, NU implică faptul că tabelele au constrângeri de cheie externă în bazele de date. Baza de date Cloudscape utilizată de Album Catalog nu defineşte nici o constrângere de cheie externă sau de integritate referenţială. Consultaţi documentaţia pentru JDBC Mediator din Centrul de informare WebSphere Application Server pentru detalii suplimentare privind utilizarea relaţiilor în metadatele relaţionale.
JSTL
Reţineţi că toate JSP-urile din acest exemplu utilizează taguri JSTL (Java Server Pages Tag
Library), cu acţiuni specificate în EL (Expression Language),
pentru accesul la datele sesiunii şi pentru fluxul condiţional.
DataObject-urile din sesiune sunt accesate de asemenea utilizând taguri JSTL. Implementarea
SDO utilizată de WebSphere Application Server furnizează o interfaţă java.util.Map pentru
DataObject-urile returnate din JDBC Mediator, ceea ce permite JSTL să acceseze proprietăţile
DataObject-urilor utilizând expresii EL; de exemplu, dacă "bandRootDataObject" este
de tip DataObject,
expresia EL "${bandRootDataObject.BAND}" este echivalentă cu apelarea
'bandRootDataObject.get("BAND")' în codul Java.
Sumarul JSP-urilor din exemplu:
- AlbumCatalog.jsp - acesta este JSP-ul principal; este punctul de intrare în exemplu. Postează cererile către AlbumCatalogServlet.
- displayBands.jsp - afişează DataObject-urile Band existente în sesiune
- displayBandAlbums.jsp - afişează DataObject-urile Album conexe ale unui DataObject Band din sesiune
- displayAlbums.jsp - afişează DataObject-urile Album existente în sesiune
- addAlbum.jsp - acceseză, din sesiune, un DataObject Album care este populat parţial numai cu câmpul BANDNAME. Afişează acest DataObject şi furnizează un formular pentru câmpurile nepopulate (ALBUMNAME, ALBUMYEAR şi RECOMMENDEDTRACKS) din DataObject. De asemenea, afişează celelalte DataObject-uri Album noi care au fost create pentru Band, dar încă nu au fost comise în baza de date.
- commitAlbums.jsp - acest jsp populează DataObject-ul creat parţial, cu informaţii colectate în addAlbum.jsp. Reţineţi că utilizează JSTL pentru a seta proprietăţile DataObject-ului Album, ceea ce este echivalent cu apelarea metodelor set(proprietate, valoare) în API-ul DataObject.
- displayAlbumCollision - dacă apare o coliziune la actualizarea DataObject-urilor Album, displayAlbumCollision.jsp afişează datele care au intrat în coliziune; afişează datele încercate, datele curente din baza de date şi datele originale.