Upload
slade
View
45
Download
2
Embed Size (px)
DESCRIPTION
Dátová vrstva. Architektúra IS na báze vrstiev. aplikačná vrstva. dátová vrstva. prezentačná vrstva. J2EE kontajner. JSP Servlet XSLT. EJB (session message driven ) servisné Java triedy. WEB browser tenký tučný Java klient. DAO ORM. RDBMS ODBMS XML s ú bory. dátový zdroj. - PowerPoint PPT Presentation
Citation preview
1
Dátová vrstva
2
Architektúra IS na báze vrstiev
prezentačná vrstva aplikačná vrstva dátová vrstva
prepojenie
na dátový zdroj
dátový zdroj
WEB
browser
tenký
tučný
Java klient
JSP
Servlet
XSLT
EJB
(session
message driven)
servisné Java triedy
DAO
ORM
RDBMS
ODBMS
XML súbory
J2EE kontajner
3
Dátová vrstva
• tradičný dátový zdroj – RDBMS• objektový a relačný svet štruktúrujú dáta
rôznym spôsobom
• problémy na riešenie• mapovanie štruktúr (štrukturálne vzory)
identifikovanie entít mapovanie asociácií, dedičnosti, ...
• pripojenie aplikačnej vrstvy k dátovej vrstve (vzory dátového zdroja)
• správanie (vzory správania) riešenie konfliktov pri zápise objektov postupné donačítavanie asociovaných objektov
4
Štrukturálne vzory
5
Idetity Field – identita objektov
• uloženie databázového ID pola (PK) ako atribút objektu
• požiadavky na Idetity Field • jedinečnosť• nemennosť
• treba zvážiť nasledovné aspekty• umelý vs. prirodzený (rodné číslo, SSN)• jednoduchý vs. zložený (orderID + seqNum)• dátový typ – efektivita => long• table-unique vs. database-unique key
inheritance unique key
6
Idetity Field – identita objektov
• tvorba nasledujúcich hodnôt ID• auto generované ID pole databázou
problém so spojenými objektami, transakciami a ohraničeniami
• database counter (Oracle Sequence) neštandardné riešenie
• GUID (Globally Unique IDentifier) veľký reťazec => výkonnostný problém
• key table
7
Foreign Key Mapping – N:1
• mapovanie asociácie medzi objektami na referenciu cudzím kľúčom medzi tabuľkami
8
Foreign Key Mapping – N:1
9
Foreign Key Mapping – 1:N
10
Foreign Key Mapping – 1:N
11
Association Table Mapping – M:N
• mapovanie asociácie M:N pomocou väzobnej tabuľky
• väzobná tabuľka väčšinou nemá in-memory reprezentáciu => nemá ID
12
• väzobná tabuľka väčšinou nemá in-memory reprezentáciu => nemá ID
• použitie• M : N asociácie• asociácie medzi tabuľkami, ktorým nemôžeme
pridať stĺpec
Association Table Mapping – M:N
13
Asociácie k N (kolekcie)
• komplikácie pri update• delete a insert• spätný pointer (referencia)• diff kolekcie
• mazanie z kolekcie ?• vymazanie objektu • zrušenie asociácie na objekt,
resp. premiestnenie do inej kolekcie
14
Embedded Value
• mapuje závislý objekt do tabuľky vlastníka• použitie
• asociácie s kardinalitou 1 až malý fixný počet• Value Objects• objekty ako pri Serialized LOB z výhodou použitia SQL
15
Serialized LOB
• uloženie asociovaného grafu malých objektov v podobe jedného serializovaného objektu
16
Serialized LOB
• BLOB – binárny LOB• jednoduché použiť (existencia serializácie grafu
objektov)• graf nie je možné zrekonštruovať bez existencie
zodpovedajúcich objektov (tried) hľadanie (chybných) dát človekom verzionovanie
• CLOB – znakový LOB• horší výkon a väčšie miesto na diskoch• vlastný parser textovej reprezentácie (XML)
• pozor na duplikovanie dát v LOBoch
17
Serialized LOB
• použitie• zložitý graf objektov, na ktorý sa referencuje
iba jeho vlastníkom
• výhody• jednoduchšia DB štruktúra• menšie množstvo dát
• nevýhody• nemožno realizovať SQL dotazy na dáta v
LOBoch
18
Mapovanie dedičnosti
• RDBMS neposkytujú realizáciu dedenia=> potreba mapovania dedičnosti na relačné
štruktúry
• Tabuľka pre dedenie
• Tabuľka pre každú triedu
• Tabuľka pre konkrétnu triedu
19
Tabuľka pre dedenie
idSadzbyplatnostOdplatnostDo
vypocitajPoplatok()
SadzbaPoplatku
sadzba
vypocitajPoplatok()
SadzbaPoplatkuZakladna
minSadzbamaxSadzba
vypocitajPoplatok()
SadzbaPoplatkuOhranicena
sumaOperacieOdsumaOperacieDo
vypocitajPoplatok()
SadzbaPoplatkuHladinova
idSadzbyplatnostOdplatnostDosadzbaminSadzbamaxSadzbasumaOperacieOdsumaOperacieDotyp
«table»SADZBA_POPLATKU
20
Tabuľka pre dedenie
• výhody• jednoduchá údržba (jediná tabuľka)• žiadne join-y pri získavaní dát• jednoduchší refactoring
posúvanie atribútov v objektovej hierarchii
• nevýhody• niektoré polia v tabuľke nemajú vždy význam• plytvanie miestom (nepoužité stĺpce)• výkonnostný problém (jedna veľká tabuľka s
množstvom indexov ...)
21
Tabuľka pre každú triedu
idSadzbyplatnostOdplatnostDo
vypocitajPoplatok()
SadzbaPoplatku
sadzba
vypocitajPoplatok()
SadzbaPoplatkuZakladna
minSadzbamaxSadzba
vypocitajPoplatok()
SadzbaPoplatkuOhranicena
sumaOperacieOdsumaOperacieDo
vypocitajPoplatok()
SadzbaPoplatkuHladinova
SADZBA
idSadzbyplatnostOdplatnostDo
sadzba
«table»SADZBA_ZAKLADNA
minSadzbamaxSadzba
«table»SADZBA_OHRANICENA
sumaOperacieOdsumaOperacieDo
«table»SADZBA_HLADINOVA
22
Tabuľka pre každú triedu
• výhody• OR mapovanie je priamočiare• všetky stĺpce sú relevantné
• nevýhody• informácie o jednom objekte vo viacerých
tabuľkách (veľa join-ov)• refactoring OO hierarchie spôsobuje zmenu
DB• supertype tabuľka môže byť úzke miesto
(často sa používa) - výkonnostný problém
23
Tabuľka pre konkrétnu triedu
idSadzbyplatnostOdplatnostDo
vypocitajPoplatok()
SadzbaPoplatku
sadzba
vypocitajPoplatok()
SadzbaPoplatkuZakladna
minSadzbamaxSadzba
vypocitajPoplatok()
SadzbaPoplatkuOhranicena
sumaOperacieOdsumaOperacieDo
vypocitajPoplatok()
SadzbaPoplatkuHladinova
«table»SADZBA_ZAKLADNA
idSadzbyplatnostOdplatnostDosadzba
«table»SADZBA_OHRANICENA
idSadzbyplatnostOdplatnostDosadzbaminSadzbamaxSadzba
«table»SADZBA_HLADINOVA
idSadzbyplatnostOdplatnostDosadzbasumaOperacieOdsumaOperacieDo
24
Tabuľka pre konkrétnu triedu
• výhody• každá tabuľka je self-contained (všetky polia využité
a patria k jednému typu objektu)• žiadne join-y pri získavaní objektov konkrétneho typu• dobrá výkonnosť (každá tabuľka pre jednu triedu)
• nevýhody• nemožné realizovať FK mapovanie na abstraktný typ• ťažší refactoring (zmena atribútu v nadtriede =>
zmena všetkých tabuliek)• získanie kolekcie supertriedy vyžaduje viacero
selektov
25
Vzory dátového zdroja
26
Vzory dátového zdroja
• Table Data Gateway• inštancia obsluhuje všetku funkcionalitu súvisiacu s
jednou tabuľkou
• Row Data Gateway• inštancia zodpovedá jednému riadku tabuľky
(rovnaká štruktúra objektu a DB záznamu)• rieši doménovú logiku a svoju perzistenciu (vzniká
priama závislosť na DB)
• Data Mapper – objektovo-relačné mapovanie (ORM)• transformuje záznam DB na objekt doménového
modelu (transparentne)
27
Objektovo-relačné mapovanie
Operacia
idOperaciedatumsumaprotiucetbankaProtiuctu
OperaciaMapovac
najdiOperaciePodlaDatumu()uloz()...()
RDBMS«use»«use»«instantiate»«instantiate»
AbstraktnyMapovac
najdiMnoho(ZdrojePrikazu) : Listnapln(ResultSet) : ListnaplnSpecialne(id, Object) : Object
ZdrojePrikazu
sql() : Stringparametre() : Object[]
NajdiOperacieDatumovo
«use»«use»
«create»«create»
• Data Mapper – dátový mapovač
28
Objektovo-relačné mapovanie
29
Objektovo-relačné mapovanie
30
Objektovo-relačné mapovanie
31
Objektovo-relačné mapovanie
32
Metadátové OR mapovania
33
Metadátové OR mapovania
• výhody• nezávislosť objektového modelu od dátového
zdroja (možnosť použiť aj bez dátového zdroja – testovanie, paralelný vývoj)
• veľká efektívnosť vývoja a údržby
• nevýhody• ťažšie ovplyvniť generované SQL dotazy (dopad
na výkonnosť)
34
Vzory správania
35
Vzory správania
• Identity Map – Mapa identít• cache načítaných objektov v rámci obchodnej
transakcie (prevencia konfliktov pri zápise) man with two watches never knows what time it is
• Unit of Work – Jednotka práce• čítanie objektov v rámci obchodnej transakcie• koordinácia zápisu zmenených objektov do DB a
riešenie konfliktov v rámci obchodnej transakcie zvyčajne obsahuje Identity Map zvyčajne je súčasťou Data Mappera
• Lazy Load – Lenivé čítanie• transparentné čítanie asociovaných objektov na
požiadanie
36
Identity Map
finder anIdentityMap
find(1)
[found is null] found = select where id = 1
found=get(1)
database
[found not null] found
37
Unit of Work
klient
operacia
databaza jednotkaPrace
commitcommit
updateupdate
selectselect
nastav stornonastav storno
savesave
newnew
register cleanregister clean
register dirtyregister dirty
38
Lazy Load
• optimalizované získavanie grafu objektov• nie je načítaný celý graf, ale je možné ho
transparentne donačítať
• Lazy Initialization• v každej metóde kontrola či je objekt loadnuty• závislosť medzi aplikačnou a databázovou vrstvou
39
Lazy Load
• Virtual Proxy• problémy s identitou (proxy sa tvári ako skutočný
objekt ale nie je to on)• pre každý typ treba proxy objekt
Java dynamic proxies, bytecode modification
• vhodné pre kolekcie
• Value Holder• lose of explixitness of strong typing
40
Lazy Initialization - príklad
class Supplier... {
public List getProducts() {
if (products == null)
products = Product.findForSupplier(getID());
return products;
}
}
41
Virtual Proxy - príklad
class SupplierVL...
private List products;
public interface VirtualListLoader {
List load();
}
class SupplierMapper...
protected DomainObject doLoad(Long id, ResultSet rs) throws SQLException {
String nameArg = rs.getString(2);
SupplierVL result = new SupplierVL(id, nameArg);
result.setProducts(new VirtualList(new ProductLoader(id)));
return result;
}
42
Virtual Proxy - príklad
public class VirtualList extends List {
private List source;
private VirtualListLoader loader;
public VirtualList(VirtualListLoader loader) {
this.loader = loader;
}
private List getSource() {
if (source == null) source = loader.load();
return source;
}
public int size() { return getSource().size(); }
public boolean isEmpty() { return getSource().isEmpty(); }
// ...
}
43
Value Holder - príklad
class SupplierVH...
private ValueHolder products;
public List getProducts() { return (List) products.getValue(); }
class ValueHolder...
private Object value;
private ValueLoader loader;
public ValueHolder(ValueLoader loader) {
this.loader = loader;
}
public Object getValue() {
if (value == null) value = loader.load();
return value;
}
public interface ValueLoader { Object load(); }
44
Value Holder - príklad
class SupplierMapper...
protected DomainObject doLoad(Long id, ResultSet rs) throws SQLException {
String nameArg = rs.getString(2);
SupplierVH result = new SupplierVH(id, nameArg);
result.setProducts(new ValueHolder(new ProductLoader(id)));
return result;
}
public static class ProductLoader implements ValueLoader {
private Long id;
public ProductLoader(Long id) { this.id = id; }
public Object load() {
return ProductMapper.create().findForSupplier(id);
}
}
45
Zhrnutie
• používať metadátové mapovanie
• realizácia metadátového mapovania je časovo a odborne náročná
• existujúce OR mapovacie nástroje• okrem riešenia mapovania OO na R štruktúry
riešia aj ostatné popísané problémy Unit of Work + Identity Map Lazy Load optimalizáciu SQL dotazov použitie SQL dialektov pre rôzne RDBMS
• TOPLink, Hibernate, OJB, Torque, iBatis